算法日常・每日刷题--<链表>3

LCR 026. 重排链表 - 力扣(LeetCode)LCR 026. 重排链表 - 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → ... → Ln-1 → Ln 请将其重新排列后变为:L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → ...不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1:https://pic.leetcode.cn/1626420311-PkUiGI-image.png输入: head = 1,2,3,4输出: 1,4,2,3示例 2:https://pic.leetcode.cn/1626420320-YUiulT-image.png输入: head = 1,2,3,4,5输出: 1,5,2,4,3 提示: * 链表的长度范围为 1, 5 \* 104 * 1 <= node.val <= 1000 注意:本题与主站 143 题相同:https://leetcode.cn/problems/reorder-list/ https://leetcode.cn/problems/reorder-list/ https://leetcode.cn/problems/LGjMqU/description/

题目描述

给定单链表头节点 head,原始链表:

限制:不能修改节点内数值,必须调整节点指针

示例: 输入链表 1 → 2 → 3 → 4 输出链表 1 → 4 → 2 → 3

解法

  1. 快慢指针找到链表中点 快指针一次走 2 步,慢指针一次走 1 步;循环结束后慢指针指向链表中点。 把链表切分成前后两半: 前半段:L0 → L1 → ... 后半段:Lmid → ... → Ln
  2. 反转后半段链表 后半段反转之后顺序变为:Ln → Ln-1 → ... → Lmid
  3. 交替合并两个链表 依次从前半段、反转后的后半段取节点拼接,完成重排。
cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    void reorderList(ListNode* head) {
        if(!head || !head->next) return;

        // 1.快慢指针找中点
        ListNode *slow = head, *fast = head;
        while(fast->next && fast->next->next){
            slow = slow->next;
            fast = fast->next->next;
        }
        // 分割前后两段
        ListNode* mid = slow->next;
        slow->next = nullptr;

        // 2.反转后半段链表
        ListNode* prev = nullptr;
        ListNode* cur = mid;
        while(cur){
            ListNode* nxt = cur->next;
            cur->next = prev;
            prev = cur;
            cur = nxt;
        }
        ListNode* rHalf = prev; // 反转后的后半段头节点

        // 3.交替合并两个链表
        ListNode* p1 = head;
        ListNode* p2 = rHalf;
        while(p2){
            ListNode* n1 = p1->next;
            ListNode* n2 = p2->next;
            p1->next = p2;
            p2->next = n1;
            p1 = n1;
            p2 = n2;
        }
    }
};
相关推荐
GreenTea5 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
fqq36 小时前
力扣刷题前置Java语法
算法·leetcode·职场和发展
2501_906565128 小时前
数学之美探究
算法
oier_Asad.Chen8 小时前
【洛谷题解/AcWing题解/OI学习笔记】洛谷P2868【USACO07DEC】Sightseeing Cows G(01分数规划求最大比率)
算法·图论·spfa·二分·负环
leisoo809710 小时前
财报数据怎么排雷本地化Python构建财务异常预警系统
人工智能·python·算法
luj_176812 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
wuyk55512 小时前
3.链表:用指针串联的动态数据结构
c语言·开发语言·数据结构·链表
郝学胜-神的一滴13 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
爱编程的小新☆13 小时前
【LeetCode】从递归到 Flood Fill:5 道题吃透 DFS 的选择、回溯与标记
java·算法·leetcode·深度优先·回溯·flood fill
Water_Sunzhipeng13 小时前
2024牛客暑期多校训练营1
算法