题目描述
思路解析动画文字版
记住这一招:先复制全部、再用 map 取副本连线。
这是原链表:上方一排是原节点,灰线是它的 next 与 random 指针。右侧 map 现在还是空的,我们要逐个建出副本。
阶段①复制:来到节点 7,新建一个值相同的副本 7'(此时副本的 next/random 都先留空),准备写入 map。
写入 map[7] = 7'。副本已登记,右侧 map 多了一条「7 → 7'」。
阶段①复制:来到节点 13,新建一个值相同的副本 13'(此时副本的 next/random 都先留空),准备写入 map。
写入 map[13] = 13'。副本已登记,右侧 map 多了一条「13 → 13'」。
阶段①复制:来到节点 11,新建一个值相同的副本 11'(此时副本的 next/random 都先留空),准备写入 map。
写入 map[11] = 11'。副本已登记,右侧 map 多了一条「11 → 11'」。
阶段①复制:来到节点 10,新建一个值相同的副本 10'(此时副本的 next/random 都先留空),准备写入 map。
写入 map[10] = 10'。副本已登记,右侧 map 多了一条「10 → 10'」。
阶段②连 next:看原图,7 的 next 指向 13(高亮这条边)。
用 map 取副本:7'.next = map[13] = 13'。副本之间的 next 接上了。
阶段②连 next:看原图,13 的 next 指向 11(高亮这条边)。
用 map 取副本:13'.next = map[11] = 11'。副本之间的 next 接上了。
阶段②连 next:看原图,11 的 next 指向 10(高亮这条边)。
用 map 取副本:11'.next = map[10] = 10'。副本之间的 next 接上了。
阶段②连 next:节点 10 是尾节点,原 next 为 null,于是副本 10'.next 也置 null。next 链全部连完。
阶段③连 random:节点 7 的 random 为 null,副本 7'.random 也置 null。
阶段③连 random:原图里 13 的 random 指向 7(高亮这条 random 边)。
用 map 取副本:13'.random = map[7] = 7'。哪怕 random 指向链表中间,也能精准接上——这正是先建 map 的好处。
阶段③连 random:原图里 11 的 random 指向 7(高亮这条 random 边)。
用 map 取副本:11'.random = map[7] = 7'。哪怕 random 指向链表中间,也能精准接上——这正是先建 map 的好处。
阶段③连 random:原图里 10 的 random 指向 13(高亮这条 random 边)。
用 map 取副本:10'.random = map[13] = 13'。哪怕 random 指向链表中间,也能精准接上——这正是先建 map 的好处。
全部节点都已复制、next 与 random 都按原图连上了。返回 map[头节点] = 7' 这个副本头,就是整条链表的深拷贝。
边界先想清。
两个高频追问。
参考代码
def copyRandomList(head): if not head: return None mp = {} # 原节点 -> 克隆副本 cur = head while cur: # 阶段1:先复制每个节点 mp[cur] = Node(cur.val) cur = cur.next cur = head while cur: # 阶段2+3:按原图连 next 和 random mp[cur].next = mp.get(cur.next) mp[cur].random = mp.get(cur.random) cur = cur.next return mp[head]复杂度
- 时间:O(N),两遍线性遍历:复制一遍、连指针一遍
- 空间:O(N),哈希表存 N 个「原 → 副本」映射
易错点
面试追问把动画讲成自己的话
追问能不能不用哈希表、做到 O(1) 额外空间?
追问哈希表的 key 用什么?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
两数相加
LeetCode 2 · 中等 · 沿着 链表 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题