[LeetCode] 143. 重排链表

题目描述:

给定一个单链表 L的头节点 head ,单链表 L 表示为:

复制代码
L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

复制代码
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

复制代码
输入:head = [1,2,3,4]
输出:[1,4,2,3]

示例 2:

复制代码
输入:head = [1,2,3,4,5]
输出:[1,5,2,4,3]

提示:

  • 链表的长度范围为 [1, 5 * 104]
  • 1 <= node.val <= 1000

题目链接:

. - 力扣(LeetCode)

解题主要思路:

我一开始想到的是用数组存储ListNode*,然后利用指针来操作,但是该方法需要借助数组实现。后来可以先利用快慢指针找到链表的中点,将链表一分为二,再将尾部的链表逆序,最后将两个链表交替合并即可。

解题代码:

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 == nullptr || head->next == nullptr || head->next->next == nullptr) return;
        // 快慢指针找中点
        ListNode* slow = head, *fast = head;
        while (fast && fast->next) {
            slow = slow->next;
            fast = fast->next->next;
        }
        // 从slow后面的断开
        ListNode* head2 = new ListNode(0);
        // 逆序slow后面的节点,头插到head2
        ListNode* cur = slow->next;
        slow->next = nullptr;
        while (cur) {
            ListNode* next = cur->next;
            cur->next = head2->next;
            head2->next = cur;
            cur = next;
        }
        // 合并两个链表
        ListNode* ret = new ListNode(0);
        ListNode* prev = ret;
        ListNode* cur1 = head, *cur2 = head2->next;
        while (cur1) {
            // 先插入第一个链表,即长的链表
            prev->next = cur1;
            cur1 = cur1->next;
            prev = prev->next;
            // 再插入第二个链表
            if (cur2) {
                prev->next = cur2;
                cur2 = cur2->next;
                prev = prev->next;
            }
            else break;
        }
        delete ret;
        delete head2;
    }
};
相关推荐
MOONICK9 分钟前
windows原生条件变量支持
c++·windows
AI科技星14 分钟前
公理化数学化学|48小时确权终稿(完整投产包)
人工智能·数学·算法·重构·拓扑学·乖乖数学·全域数学
汉克老师21 分钟前
GESP2026年6月认证C++二级( 第三部分编程题(1、完全平方数计数))精讲
c++·循环·枚举算法·gesp2级·平方数·逆向枚举·区间判断
wuminyu22 分钟前
markword在高并发场景下变化剖析
java·linux·c语言·jvm·c++
星夜夏空9924 分钟前
C++学习(1) ——C与C++
c语言·c++·学习
旖-旎31 分钟前
QT界面优化(6)
开发语言·c++·qt
想你依然心痛33 分钟前
AtomCode在算法竞赛中的实战体验:LeetCode周赛辅助编程
linux·算法·leetcode
SilentSamsara38 分钟前
模型部署方案选型:REST/gRPC/批量推理/边缘部署的场景决策
人工智能·深度学习·算法·机器学习
UP_Continue38 分钟前
AutoCAD--图形命令和选项
c++·autopilot
zzz_236844 分钟前
【Java实习面试算法冲刺】哈希!
java·算法·面试