[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;
    }
};
相关推荐
卑微的小鬼2 分钟前
golang的var ,make ,new, := 的区别
算法
MZWeiei44 分钟前
PTA:有序顺序表的插入
数据结构
01_1 小时前
力扣hot100 ——和为k的子数组 前后缀和(积)各种情况总结
数据结构·算法·leetcode·前后缀和(积)计算
刀客1231 小时前
数据结构与算法再探(七)查找-排序
数据结构
一只码代码的章鱼1 小时前
数据结构与算法-搜索-双向搜索 和 A*算法(字串变换,八数码,第k短路)
算法
咚咚轩1 小时前
算法1-2 排序(快排)
算法
楼台的春风1 小时前
【STM32 基于PID的闭环电机控制系统】
c语言·stm32·单片机·嵌入式硬件·mcu·物联网·算法
老A的AI实验室1 小时前
通俗理解Test time Scaling Law、RL Scaling Law和预训练Scaling Law
人工智能·深度学习·算法·chatgpt·llm·agi·rl
_Itachi__2 小时前
LeetCode 热题 100 206. 反转链表
算法·leetcode·链表
EnigmaCoder2 小时前
单链表:数据结构中的灵活“链条”
c语言·数据结构·学习