LeetCode 138 複製帶隨機指標的鍊錶

2022-08-11 19:51:25 字數 1512 閱讀 1246

給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。

要求返回這個鍊錶的 深拷貝。 

我們用乙個由 n 個節點組成的鍊錶來表示輸入/輸出中的鍊錶。每個節點用乙個 [val, random_index] 表示:

val:乙個表示 node.val 的整數。

random_index:隨機指標指向的節點索引(範圍從 0 到 n-1);如果不指向任何節點,則為  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。

-10000 <= node.val <= 10000

node.random 為空(null)或指向鍊錶中的節點。

節點數目不超過 1000 。

這道題畫個圖會比較好理解,做法就是在原煉表中,在每個結點的後面複製乙個與它相同的結點。然後,讓複製的結點的random指標和被複製的結點的一樣。再將原鍊錶和複製鍊錶分離開來。

寫了兩個版本的**,區別在於乙個用的while迴圈,乙個用的for迴圈,用for迴圈會比較簡潔。還有就是在分離操作的時候,乙個用了雙指標,有點繁瑣,但是很好想啦。其實用乙個指標就可以完成分離操作,但要定義乙個dummy虛擬頭結點。

c++**如下:

1

class

solution

12 auto k =head;

13while

(k)17 auto copy = head->next;

18 auto a = head, b = head->next->next;

19while

(b)25 a->next =b;

26return

copy;27}

28 };

更簡潔、更妙的解法如下:

1

class

solution

1011

for(auto k = head; k; k = k->next->next)

14 auto dummy = new node(-1

);15 auto cur =dummy;

16for(auto p = head; p;p = p->next)

2122

return dummy->next;23}

24 };

LeetCode 138 複製帶隨機指標的鍊錶

1.題目 2.解答 第一次遍歷鍊錶的時候,複製舊鍊錶的節點值建立乙個新的鍊錶,同時定義乙個 unordered map 作為雜湊表,雜湊表的鍵為舊鍊錶的節點指標,值為新鍊錶的節點指標。然後,第二次遍歷鍊錶,訪問舊鍊錶節點的隨機指標,然後以此為鍵從 map 中取出對應的新鍊錶節點指標,這也就是當前新鍊...

Leetcode 138 複製帶隨機指標的鍊錶

題目 給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。要求返回這個鍊錶的深拷貝。示例 輸入 got eof at end of input 1 next at position 9 ref 2 val 2 rand ref 2 val 1 my defini...

LeetCode 138 複製帶隨機指標的鍊錶

給定乙個鍊錶,每個節點包含乙個額外增加的隨機指標,該指標可以指向鍊錶中的任何節點或空節點。要求返回這個鍊錶的深拷貝。示例 解釋 節點 1 的值是 1,它的下乙個指標和隨機指標都指向節點 2 節點 2 的值是 2,它的下乙個指標指向 null,隨機指標指向它自己。你必須返回給定頭的拷貝作為對轉殖列表的...