leecode 劍指 Offer 35. 複雜連結串列的複製
阿新 • • 發佈:2021-02-09
劍指 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。
解法一:
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)