算法日常・每日刷题--<链表>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;
        }
    }
};
相关推荐
倒头就睡的小比特4 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼4 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
m0_547486664 天前
《数据结构教程》全套 PPT课件2026
数据结构
旖旎夜光4 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark4 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her14 天前
并查集-听课笔记
笔记·算法·并查集
码流子4 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven4 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark4 天前
从算法设计模式看编程思维的抽象能力4
算法