[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;
    }
};
相关推荐
汤姆爱耗儿药5 分钟前
数据结构——散列表
数据结构·散列表
UnderTheTime7 分钟前
2025 XYD Summer Camp 7.10 筛法
算法
zstar-_7 分钟前
Claude code在Windows上的配置流程
笔记·算法·leetcode
圆头猫爹23 分钟前
第34次CCF-CSP认证第4题,货物调度
c++·算法·动态规划
秋说26 分钟前
【PTA数据结构 | C语言版】出栈序列的合法性
c语言·数据结构·算法
十五年专注C++开发34 分钟前
hiredis: 一个轻量级、高性能的 C 语言 Redis 客户端库
开发语言·数据库·c++·redis·缓存
用户403159863966340 分钟前
多窗口事件分发系统
java·算法
用户403159863966343 分钟前
ARP 缓存与报文转发模拟
java·算法
hi0_61 小时前
03 数组 VS 链表
java·数据结构·c++·笔记·算法·链表
aPurpleBerry1 小时前
hot100 hot75 栈、队列题目思路
javascript·算法