题目描述
请实现 copyRandomList
函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next
指针指向下一个节点,还有一个 random
指针指向链表中的任意节点或者 null
。
示例 1:
1 2
| 输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]] 输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
|
示例 2:
1 2
| 输入:head = [[1,1],[2,1]] 输出:[[1,1],[2,1]]
|
示例 3:
1 2
| 输入:head = [[3,null],[3,0],[3,null]] 输出:[[3,null],[3,0],[3,null]]
|
示例 4:
1 2 3
| 输入:head = [] 输出:[] 解释:给定的链表为空(空指针),因此返回 null。
|
提示:
-10000 <= Node.val <= 10000
Node.random
为空(null)或指向链表中的节点。- 节点数目不超过 1000 。
题目链接
Leetcode
题目解答
哈希表,遍历链表,为链表中的每个节点生成一个新的节点,把当前节点和新节点的对应关系存入哈希表中,再次遍历,通过当前节点和新节点的对应关系,当前节点和随机节点的的对应关系,我们就可以构造出新节点和新随机节点的对应关系,重复这一过程,直至链表末端,就完成了复杂链表的复制。
时间复杂度:$O(n)$ 空间复杂度:$O(n)$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
class Solution { public Node copyRandomList(Node head) { Map<Node,Node> map = new HashMap<>(); Node curr = head; while (curr != null) { Node node = new Node(curr.val); map.put(curr,node); curr = curr.next; } curr = head; while( curr != null) { Node node = map.get(curr); node.next = map.get(curr.next); node.random = map.get(curr.random); curr = curr.next; } return map.get(head); } }
|
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:38.3 MB, 在所有 Java 提交中击败了26.46%的用户
-------------本文结束 感谢您的阅读-------------
文章对您有帮助,可以打赏一杯咖啡,鼓励我继续创作!