题目描述
思路解析动画文字版
核心就是「odd 接 odd、even 接 even」两条线交替往前缝,缝完把两条线拼起来。
odd 指向奇链当前末尾(第 1 个节点,值 1),even 指向偶链当前末尾(第 2 个节点,值 2)。奇链先认下第 1 个(标绿)。oddHead 就是最终的新头。
第 1 轮:odd 末尾是 1,even 末尾是 2。even 后面紧跟的是 3(它在奇位置)。要做 odd.next = even.next,把 3 接到奇链尾 1 后面。
执行 odd.next = even.next:3 接到奇链尾后面(标绿入奇链),odd 前进到 3。现在奇链是 1→3。被抽走 3 后,原来 even 后面自然空出来,待会儿把它接到偶链。
执行 even.next = odd.next:偶链尾 2 接上下一个偶位置节点 4,even 前进到 4。奇、偶两条线各往前缝了一格,进入下一轮。
第 2 轮:odd 末尾是 3,even 末尾是 4。even 后面紧跟的是 5(它在奇位置)。要做 odd.next = even.next,把 5 接到奇链尾 3 后面。
执行 odd.next = even.next:5 接到奇链尾后面(标绿入奇链),odd 前进到 5。现在奇链是 1→3→5。被抽走 5 后,原来 even 后面自然空出来,待会儿把它接到偶链。
执行 even.next = odd.next:偶链尾 4 接上下一个偶位置节点 6,even 前进到 6。奇、偶两条线各往前缝了一格,进入下一轮。
第 3 轮:odd 末尾是 5,even 末尾是 6。even 后面紧跟的是 7(它在奇位置)。要做 odd.next = even.next,把 7 接到奇链尾 5 后面。
执行 odd.next = even.next:7 接到奇链尾后面(标绿入奇链),odd 前进到 7。现在奇链是 1→3→5→7。被抽走 7 后,原来 even 后面自然空出来,待会儿把它接到偶链。
执行 even.next = odd.next:偶链尾 6 接上下一个偶位置节点 8,even 前进到 8。奇、偶两条线各往前缝了一格,进入下一轮。
第 4 轮:odd 末尾是 7,even 末尾是 8。even 后面紧跟的是 9(它在奇位置)。要做 odd.next = even.next,把 9 接到奇链尾 7 后面。
执行 odd.next = even.next:9 接到奇链尾后面(标绿入奇链),odd 前进到 9。现在奇链是 1→3→5→7→9。被抽走 9 后,原来 even 后面自然空出来,待会儿把它接到偶链。
最后一步 odd.next = evenHead:把奇链尾 9 接到偶链头 2 上。奇链(1→3→5→7→9)在前、偶链(2→4→6→8)在后,正式拼成一条。
重排完成:1→3→5→7→9→2→4→6→8。奇位置节点(1→3→5→7→9)全在前,偶位置(2→4→6→8)全在后,各自相对顺序不变。返回原头节点 1(它一直是奇链头)。
空 / 单 / 双 / 三节点先想清,代码天然覆盖。
两个高频追问,原地 O(1) 是本题的考点。
参考代码
def oddEvenList(head): if not head or not head.next: return head odd = head even = head.next even_head = even # 记住偶链头 while even and even.next: odd.next = even.next # 奇链接下一个奇位置 odd = odd.next even.next = odd.next # 偶链接下一个偶位置 even = even.next odd.next = even_head # 奇尾接偶头 return head复杂度
- 时间:O(n),每个节点只被重接一次,整条扫一遍
- 空间:O(1),只用 odd / even / evenHead 三个指针,原地改 next
易错点
面试追问把动画讲成自己的话
追问为什么相对顺序能保持不变?
追问能不能用一个额外数组先存奇位置再存偶位置?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
扁平化多级双向链表
LeetCode 430 · 中等 · 沿着 链表套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题