算法日常・每日刷题--<链表>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;
        }
    }
};
相关推荐
geovindu1 小时前
go: Iterative Algorithms
开发语言·后端·算法·golang·迭代算法
稚南城才子,乌衣巷风流3 小时前
块状链表:数据结构详解与实现
数据结构·链表
Zachery Pole4 小时前
CCF-CSP备战NO.7【队列】
算法
闪电悠米4 小时前
力扣hot100-48.旋转图像-转置翻转详解
算法·leetcode·职场和发展
满天星83035774 小时前
【算法】最长递增子序列(三种解法)
算法
啦啦啦啦啦zzzz5 小时前
算法:贪心算法
c++·算法·leetcode·贪心算法
日拱一卒——功不唐捐6 小时前
红黑树删除(C语言)
c语言·数据结构
清泓y6 小时前
RAG 技术
算法·ai
不如语冰6 小时前
AI大模型入门-Python进阶-上下文管理与with语句
开发语言·数据结构·数据库·人工智能·pytorch·redis·python