0138. 随机链表的复制
文章目录
- 题目链接
- 题目描述
- 解题思路
- 参考代码
- 复杂度分析
题目链接
https://leetcode.cn/problems/copy-list-with-random-pointer/
题目描述
给定一个含随机指针 random 的链表,每个节点除了 next 指针外还有一个 random 指向链表中的任意节点或 null。请深拷贝并返回该链表的头节点。
解题思路
- 哈希表映射:
- 第一次遍历:为每个原节点创建拷贝节点,并记录映射 原→新。
- 第二次遍历:利用映射补齐新节点的 next 与 random 指针。
- 也可用原地三步法(穿插克隆节点、设置 random、拆分)达到 O(1) 额外空间。
参考代码
// Definition for a Node.
// class Node {
// int val;
// Node next;
// Node random;
// public Node(int val) { this.val = val; }
// }class Solution {public Node copyRandomList(Node head) {if (head == null) return null;Map<Node, Node> map = new HashMap<>();// 1) 克隆所有节点,建立原->新映射for (Node cur = head; cur != null; cur = cur.next) {map.put(cur, new Node(cur.val));}// 2) 连接新链表的 next 与 randomfor (Node cur = head; cur != null; cur = cur.next) {Node clone = map.get(cur);clone.next = map.get(cur.next); // cur.next 可能为 null,map.get(null) 返回 null,正合适clone.random = map.get(cur.random); // 同理}return map.get(head);}
}
复杂度分析
- 时间复杂度:O(n),两次线性遍历。
- 空间复杂度:O(n),哈希表存储原节点到新节点的映射。
