算法日常・每日刷题--<链表>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;
        }
    }
};
相关推荐
闻缺陷则喜何志丹几秒前
【动态规划】P3609 [USACO17JAN] Hoof, Paper, Scissor G
c++·算法·动态规划·洛谷
heima20166 分钟前
长期复盘:拼团活动链接开发公司的行业现状与困境洞察
链表
leihefeng31 分钟前
手写数字识别:KNN vs 逻辑回归实战
python·算法·机器学习·逻辑回归·scikit-learn
全栈技术负责人1 小时前
DeepSeek Harness 业务工具权限插件 dsh-tool-permission设计思路
网络·算法·ai·ai编程
mmmmath_31 小时前
面试题 02.07. 链表相交
算法·链表
residual_fan2 小时前
特征级SMOTE(Feature-level SMOTE)论文分享
人工智能·算法·数据挖掘·数据分析
xxwxx__2 小时前
深入理解 C++ STL:stack、queue 与 deque 从使用到底层实现全解析
开发语言·c++·算法
sylviiiiiia2 小时前
Leetcode hot100 多数元素/相交链表/反转链表
算法·leetcode·链表
CoderYanger2 小时前
A.每日一题:3622. 判断整除性
java·程序人生·算法·leetcode·面试·职场和发展·蓝桥杯
rannn_1112 小时前
【力扣hot100】动态规划专题|70、118、198、279、322、139、300、152、416、32
算法·leetcode·动态规划