前往
大廳
主題

LeetCode - 138. Copy List with Random Pointer 解題心得

Not In My Back Yard | 2022-11-08 12:00:27 | 巴幣 0 | 人氣 370

題目連結:


題目意譯:
給定一個長度 n 的連結串列(Linked List),而每個節點包含著一個額外的隨機指標 random,其可以指向串列中任何一個節點,又或者是空節點(null)。

請建出串列的一個深拷貝(Deep Copy,參見英文維基)。該拷貝應由恰好 n 個全新的節點所組成,其中每個新節點有著對應到原先節點的節點值。next 和 random 指標應指向在拷貝後的串列中相對應的節點,使得原始串列中的指標與拷貝後的指標代表著相同的串列之狀態。新串列中不得有任何指標指回到原始的串列中。

例如,如果現在於原始串列中有兩個節點 X 和 Y,其中 X.random --> Y,接著對應於拷貝後的串列中的兩的節點 x 和 y,滿足 x.random --> y。

回傳拷貝後的串列之開頭節點。

連結串列在輸入輸出中表為 n 個節點的一個列表。每個節點以一對 [val, random_index] 所表示,其中:
val:表示節點值的一個整數
random_index:隨機指標指向的節點之索引值(範圍為 0 到 n - 1),又或者可能為空節點,代表其並沒有指向任何節點。

你的程式只會被給定原始連結串列的開頭 head。

限制:
0 ≦ n ≦ 1000
-10 ^ 4 ≦ Node.val ≦ 10 ^ 4
Node.random 為空節點或是指向連結串列中的某個節點。



範例測資:
範例 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]]


解題思維:
首先我們忽略掉 random 這種指標,僅僅從 head 開始一直藉由其 next 指標來掃過所有節點。而期間每遇到一個節點就新增一個節點,並使其上一個(開頭沒有前一個,所以忽略)節點指向這個新的節點以保持 next 之相對資訊(基本上精神就跟這題一樣)。

接著再來處理 random,方式很簡單——在先前建立新串列的時候順帶建立原始串列與新串列的節點一一對應的關係圖(可以直接多用一個陣列把資訊存下來。不過也可以用新節點的 random 指標來做到這件事情,參見範例程式碼)。然後掃過原始串列中每個節點 n(忽略已經經過接下來的處理之節點),按照其 random 指標去到下一個節點 n',期間把 n 於新串列中對應的節點之 random 指向 n' 於新串列中對應者。然後對 n' 重複這個動作,直到某個節點的 random 是指向空節點,此時就回到掃過原始串列的動作。

這樣便可以把所有相對的資訊複製到新串列中,完成深拷貝。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作