🧩Algo 链表
138. 随机链表的复制
难度:🟡 Medium | 标签:链表、哈希 | 状态:⬜ LeetCode 链接
思路
哈希法:第一遍按 next 复制节点,建立 老→新 映射;第二遍设置 random(查表)。
进阶:节点穿插法 O(1) 空间——把新节点插在老节点后,random 通过 old->random->next 取,最后拆开。
代码
class Solution {
public:
Node* copyRandomList(Node* head) {
unordered_map<Node*, Node*> mp;
for (Node* p = head; p; p = p->next) mp[p] = new Node(p->val);
for (Node* p = head; p; p = p->next) {
mp[p]->next = mp[p->next];
mp[p]->random = mp[p->random];
}
return mp[head];
}
};
复杂度
- 时间 O(n),空间 O(n)(穿插法 O(1))
易错 / 回顾
- 哈希默认值是 nullptr,所以
mp[nullptr] = nullptr自动正确 - 穿插法精巧但易错,面试一般写哈希就够
- 一遍 DFS + 哈希也可
Related · 链表