🚩传送门:牛客题目

题目

请实现 [LC]35. 复杂链表的复制 - 图1函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个[LC]35. 复杂链表的复制 - 图2 指针指向下一个节点,还有一个[LC]35. 复杂链表的复制 - 图3 指针指向链表中的任意节点或者[LC]35. 复杂链表的复制 - 图4

示例 1:
[LC]35. 复杂链表的复制 - 图5

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]] 输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

解题思路:哈希表

利用哈希表的查询特点,考虑构建 原链表节点新链表对应节点 的键值对映射关系,再遍历构建新链表各节点的[LC]35. 复杂链表的复制 - 图6[LC]35. 复杂链表的复制 - 图7引用指向即可。

复杂度分析

时间复杂度: [LC]35. 复杂链表的复制 - 图8 ,其中 [LC]35. 复杂链表的复制 - 图9 是链表的长度,两轮遍历链表。

空间复杂度:[LC]35. 复杂链表的复制 - 图10 ,哈希表[LC]35. 复杂链表的复制 - 图11 使用线性大小的额外空间。

我的代码

  1. class Solution {
  2. public Node copyRandomList(Node head) {
  3. HashMap<Node, Node> map = new HashMap<Node, Node>();
  4. Node next = head;
  5. // 空指针映射关系
  6. map.put(null, null);
  7. // 建立原链表结点与新链表结点的映射关系
  8. while (next != null) {
  9. map.put(next, new Node(next.val));
  10. next = next.next;
  11. }
  12. next = head;
  13. Node newHead=map.get(next);
  14. Node Tail=newHead;
  15. // 构建 next、random
  16. while (next!=null){
  17. Tail.random=map.get(next.random);
  18. Tail.next=map.get(next.next);
  19. next=next.next;
  20. Tail=Tail.next;
  21. }
  22. return newHead;
  23. }
  24. }