题目地址(35. 复杂链表的复制)

https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/

题目描述

  1. 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null
  2. 示例 1
  3. 输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
  4. 输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
  5. 示例 2
  6. 输入:head = [[1,1],[2,1]]
  7. 输出:[[1,1],[2,1]]
  8. 示例 3
  9. 输入:head = [[3,null],[3,0],[3,null]]
  10. 输出:[[3,null],[3,0],[3,null]]
  11. 示例 4
  12. 输入:head = []
  13. 输出:[]
  14. 解释:给定的链表为空(空指针),因此返回 null
  15. 提示:
  16. -10000 <= Node.val <= 10000
  17. Node.random 为空(null)或指向链表中的节点。
  18. 节点数目不超过 1000
  19. 注意:本题与主站 138 题相同:https://leetcode-cn.com/problems/copy-list-with-random-pointer/

前置知识


公司

  • 暂无

思路

关键点


代码

  • 语言支持:Java

Java Code:

  1. /*
  2. // Definition for a Node.
  3. class Node {
  4. int val;
  5. Node next;
  6. Node random;
  7. public Node(int val) {
  8. this.val = val;
  9. this.next = null;
  10. this.random = null;
  11. }
  12. }
  13. */
  14. class Solution {
  15. public Node copyRandomList(Node head) {
  16. if(head == null){
  17. return null;
  18. }
  19. Node cur = head;
  20. //1. 将链表 1->2->3 构建成 1->1->2->2->3->3
  21. while (cur != null) {
  22. Node temp = new Node(cur.val);
  23. temp.next = cur.next;
  24. cur.next = temp;
  25. cur = cur.next.next;
  26. }
  27. //2. 让复制出来的链表的random = 原来的random.next
  28. cur = head;
  29. while (cur != null) {
  30. if (cur.random != null) {
  31. cur.next.random = cur.random.next;
  32. }
  33. cur = cur.next.next;
  34. }
  35. //3. 拆分复制的链表 并将原来的链表还原
  36. cur = head.next;
  37. //指向初始链表的开头
  38. Node pre = head;
  39. //最后返回的复制的链表
  40. Node res = head.next;
  41. while (cur.next != null) {
  42. //顺序不能反 如果先cur的话 pre.next.next 就会指向更改后的cur.next
  43. pre.next = pre.next.next;
  44. cur.next = cur.next.next;
  45. pre = pre.next;
  46. cur = cur.next;
  47. }
  48. //最后记得把初始的链表的最后一个节点指向null 不然还是指向的复制链表的最后一个
  49. pre.next = null;
  50. return res;
  51. }
  52. }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:剑指 Offer 35. 复杂链表的复制 - 图1#card=math&code=O%28n%29&id=AtqDT)
  • 空间复杂度:剑指 Offer 35. 复杂链表的复制 - 图2#card=math&code=O%28n%29&id=KqqSo)