題目:輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
牛客網:鏈結
大部分人首先想到的可能是先複製複雜指標的label和next,然後再查詢random並更新。查詢random又分為兩種,一種是每次都從頭查詢,時間複雜度為o(n^2);另一種是空間換時間,複製label和next的同時建立乙個hash表來存放新舊複雜指標的對應關係,所以後續只需一步就能找到random,演算法時間複雜度為o(n)。
我們這裡將複雜鍊錶的複製過程分解為三個步驟。在寫**的時候我們每一步定義乙個函式,這樣每個函式完成乙個功能,整個過程的邏輯也就非常清晰明了了。
我們這裡採用三步:
第一步:複製複雜指標的label和next。但是這次我們把複製的結點跟在元結點後面,而不是直接建立新的鍊錶;
第二步:設定複製出來的結點的random。因為新舊結點是前後對應關係,所以也是一步就能找到random;
第三步:拆分鍊錶。奇數是原鍊錶,偶數是複製的鍊錶。
有圖思路更清晰:
# 返回 randomlistnode
def clone(self, phead):
# write code here
if not phead:
return phead
'''複製原來的鍊錶,順次連線形成新鍊錶'''
clonode = phead
while clonode:
node = randomlistnode(clonode.label)
node.next = clonode.next
clonode.next = node
clonode = node.next
'''利用原節點的random指向,來用複製的相應節點的random'''
clonode = phead
while clonode:
node = clonode.next
if clonode.random:
node.random = clonode.random.next
clonode = node.next
'''將複製好的鍊錶拆分出來'''
clonode = phead
phead = phead.next
'''必須要拆分成兩個列表 因為複製鍊錶的最後乙個結點的next指標不能跟原鍊錶指向同乙個空結點none
一定要判斷的是clonode.next是否存在 我理解的是移動到倒數第二個結點時 給複製的鍊錶賦值了乙個新none
移動到倒數第乙個節點時,就直接退出,而連線的就是原來的none'''
while clonode.next:
node = clonode.next
clonode.next = node.next
clonode = node
return phead
劍指offer 25題 複雜鍊錶複製
題目 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 返回 randomlistnode 返回 randomlistnode def ne...
25 劍指offer 複雜鍊錶的複製
分解讓複雜問題簡單 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 struct randomlistnode class solutio...
劍指offer 面試25題
面試25題 題目 合併兩個排序的鍊錶 題 輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。解題思路 遞迴,並需注意對空鍊錶單獨處理。解題 coding utf 8 class listnode def init self,x self.val x self...