1. 程式人生 > 其它 >leecode 劍指 Offer 35. 複雜連結串列的複製

leecode 劍指 Offer 35. 複雜連結串列的複製

技術標籤:連結串列指標leetcode單鏈表演算法

劍指 Offer 35. 複雜連結串列的複製

請實現 copyRandomList 函式,複製一個複雜連結串列。在複雜連結串列中,每個節點除了有一個 next 指標指向下一個節點,還有一個 random 指標指向連結串列中的任意節點或者 null。

示例 1:

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

示例 2:

輸入:head = [[1,1],[2,1]]
輸出:[[1,1],[2,1]]

示例 3:

輸入:head = [[3,null],[3,0],[3,null]]
輸出:[[3,null],[3,0],[3,null]]

示例 4:

輸入:head = []
輸出:[]

解釋:給定的連結串列為空(空指標),因此返回 null。

解法一:

思路參考:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/solution/lian-biao-de-shen-kao-bei-by-z1m/481293

1.複製每一個結點,使得複製後的結點都在當前結點的下一個結點,例如A->B-C變成A->A'->B->B'->C->C'

2. 設定每個副本結點的random指標
3.將連結串列斷開,例如A->A'->B->B'->C->C'變成A'->B'->C',且注意這一步應當將原連結串列復原

 1 /*
 2 // Definition for a Node.
 3 class Node {
 4     int val;
 5     Node next;
 6     Node random;
 7 
 8     public Node(int val) {
 9         this.val = val;
10         this.next = null;
11         this.random = null;
12     }
13 }
14 */
15 class Solution {
16     public Node copyRandomList(Node head) {
17         if(head == null)
18             return null;
19 
20         // 複製每一個結點,使得複製後的結點都在當前結點的下一個結點,例如A->B-C變成A->A'->B->B'->C->C'
21         Node cur = head;
22         Node tmp = null;
23         while(cur != null){
24             tmp = new Node(cur.val);
25             tmp.next = cur.next;
26             cur.next = tmp;
27             cur = tmp.next;
28         }
29 
30         // 第二步將random指標連線起來
31         cur = head; // cur指標復位,重新指向連結串列頭部
32         while(cur != null){
33             if(cur.random != null){
34                 cur.next.random = cur.random.next;
35             }
36             cur = cur.next.next;
37         }
38 
39         // 第三步將連結串列斷開,例如A->A'->B->B'->C->C'變成A'->B'->C',且注意這一步應當將原連結串列復原
40         Node copyList = head.next, copycur = head.next;
41 
42         cur = head;
43         while(cur != null){
44             cur.next = cur.next.next;
45             cur = cur.next;
46             if(copycur.next != null){
47                 copycur.next = copycur.next.next;
48                 copycur = copycur.next;
49             }
50         }
51         return copyList;
52     }
53 }

leetcode執行時間為0ms, 空間為38.7MB

複雜度分析:

時間複雜度:遍歷了三次連結串列,所以時間複雜度為O(3n)

空間複雜度:每個結點都被拷貝了一次,所以空間複雜度為O(n)