LC 143链表中等第 32 / 95 题

重排链表

Reorder List

快慢指针反转合并
本机进度仅保存在当前浏览器

题目描述

给定单链表 L:L0 -> L1 -> ... -> Ln-1 -> Ln,重排为 L0 -> Ln -> L1 -> Ln-1 -> ...。不能只改节点值,必须实际交换节点,要求原地完成。

示例:1 -> 2 -> 3 -> 4 -> 5 重排为 1 -> 5 -> 2 -> 4 -> 3。

解题思路

  1. 目标序列是"前半段正序 + 后半段逆序"交错,因此拆成三步经典操作的组合。
  2. 第一步快慢指针找中点,把链表一分为二;第二步反转后半段;第三步把两段按"前一个 + 后一个"交错合并。
  3. 三个子操作都是链表基本功(206 反转、876 中点、21 合并),组合即解,注意断开中点前先断链防环。

参考实现

查看参考实现Python · 建议先自行作答
def reorderList(head):
    # 1. 快慢指针找中点
    slow = fast = head
    while fast.next and fast.next.next:
        slow = slow.next
        fast = fast.next.next
    second = slow.next
    slow.next = None

    # 2. 反转后半段
    prev = None
    while second:
        nxt = second.next
        second.next = prev
        prev = second
        second = nxt

    # 3. 交错合并两段
    p, q = head, prev
    while q:
        nxt = q.next
        q.next = p.next
        p.next = q
        p = q.next
        q = nxt

复杂度与归属

时间复杂度O(n)
空间复杂度O(1)
所属分类链表
题源LeetCode 143

关联教程

返回题图鉴