138. Copy List with Random Pointer
題目網址:https://leetcode.cn/problems/copy-list-with-random-pointer/
題意:給一長度為
n
的 linked list, 每個節點包含一個額外增加的隨機 pointerrandom
, 該 pointer 可以指向 linked list 中的任何節點 or 空節點。建構該 linked list 的 deep copy, 它由
n
個新節點組成, 其中每個新節點的值都設為其對應的node.val
。新節點的
next
和random
也都應指向新 linked list 中的其他節點, 使原 linked list 和新 linked list 能夠表示成相同的 linked list。e.g. 如果原 linked list 中有
X
和Y
兩個節點, 其中X.random --> Y
。則新 linked list 中對應的兩個節點x
和y
, 同樣有x.random --> y
。返回新 linked list 的
head
。
Solution 1:
想法:利用 hash table, 先遍歷原 linked list, 並在遍歷的同時不斷創建新節點, 將
原節點
作為key
、新節點
作為value
放入 hash table 中。最後, 再遍歷一次原 linked list, 並設置新 linked list 的next
和random
class Solution { |
- time:$O(n)$ ➔ 遍歷 linked list
- space:$O(n)$ ➔
oldToNew
Solution 2:
想法:分成三個步驟
- 根據遍歷到的原節點來創建對應的新節點, 並把每個新節點放在原節點後面
e.g.1 -> 1' -> 2 -> 2' -> 3 -> 3'
- 設置新節點的
random
➔ 新節點的random
為原節點的random->next
(原random
對應的新節點)- 將兩個 linked list 分開
class Solution { |
- time:$O(n)$ ➔ 遍歷 linked list
- space:$O(1)$ ➔ 若不考慮要 copy 的 node, 只需常數空間
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論