题目描述
思路解析动画文字版
用数组存节点再重连可以做,但链表题重点是原地改指针。
快慢指针找中点,反转后半段,再一前一后交替插入。
快慢指针找中点 · slow 停在 3:先用快慢指针找中点:fast 一次两步、slow 一次一步。fast 到尾时,slow 正好停在中间 3。从这里把链表劈成两半。
后半段三指针反转 4→5 变 5→4:从中点断开:前半 1→2→3、后半 4→5。把后半段三指针反转(prev/cur/nxt 边走边掉头)→ 变成 5→4。
两半就位 · 准备一前一后交替插:现在两条链对齐:前半 1→2→3、反转后的后半 5→4。接下来各取一个、交替穿插合并。
交替合并 · 1→5→2…:交替接线:1 的 next 接后半的 5,5 的 next 再接前半的 2 —— 1→5→2。每次从两条链各取一个,你一个我一个。
交替到底 · 原地重排完成:继续交替到两条链取空:1→5→2→4→3。全程只改指针指向、不新建节点 → 原地完成,O(1) 额外空间。
一句话记住:快慢指针找中点,反转后半段,再一前一后交替插入。
边界三连:边界三连先过:空输入、单元素、重复或相等值。能过这三类,主逻辑才算站稳。
雷区 · 断开前必须先记住后半的头:雷区:① 劈两半时 slow.next 要置 null 断开前半尾,否则合并后成环;② 反转后半前先记住它的头。三步(找中点/反转/合并)指针多,顺序错就丢节点。
面试追问 1:快慢指针找中点,反转后半段,再一前一后交替插入。
面试追问 2:面试追复杂度时,不要只报 O,要把“每个元素进出几次”讲清楚。
面试追问 3:重排链表 不是孤题,它练的是 链表 的状态设计。
这题学完不要乱跳,下一步去对应专题 /leetcode-animation/ds?k=linkedlist 连刷同类题;卡住时用 AI 答疑问“我的状态定义哪里不稳”。
参考代码
class Solution: def reorderList(self, head): if not head or not head.next: return slow, fast = head, head.next while fast and fast.next: slow = slow.next fast = fast.next.next second = slow.next slow.next = None prev = None while second: nxt = second.next second.next = prev prev = second second = nxt first, second = head, prev while second: n1, n2 = first.next, second.next first.next = second second.next = n1 first, second = n1, n2复杂度
- 时间复杂度:O(n),每个状态只按核心结构推进有限次
- 空间复杂度:O(1),原地改指针:找中点+反转后半+交替合并,只用常数个指针,无栈/堆/表
可套用的代码模板
这一步不是复读 重排链表 的参考答案,而是抽出能迁移的骨架:先定义状态,再按动画的核心分支更新。
# 1. 定义状态state = init()# 2. 按顺序读输入for x in data: update(state, x) # 只做本题允许的安全转移# 3. 从状态里取答案return answer(state)易错点
面试追问把动画讲成自己的话
追问这题的核心状态是什么?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
删除倒数第 N 个结点
LeetCode 19 · 中等 · 沿着 链表 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题