劍指Offer 程式設計題25 複雜鍊錶的複製

2021-08-25 11:10:58 字數 1953 閱讀 7640

題目:輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的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...