鍊錶中環的入口節點

2021-09-11 18:46:47 字數 1485 閱讀 6371

題目描述

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。

思路:(1)判斷有沒有環

(2)找出環

方法一:時間複雜度o(n),空間複雜度o(1),因為除了儲存空間來寄存本身所用指令、常數、變數和輸入資料外等,若輸入資料所佔空間只取決於問題本身,和演算法無關,則為o(1)

# -*- coding:utf-8 -*-

class listnode:

def __init__(self, x):

self.val = x

self.next = none

class solution:

def entrynodeofloop(self, phead): # phead 為頭節點,輸入頭節點相當於輸入整個鍊錶

if not phead or not phead.next:

return none

fast = slow = phead

while fast and fast.next:

fast = fast.next.next

slow = slow.next

if fast == slow:

fast = phead

while fast != slow:

fast = fast.next

slow = slow.next

return fast

return none # 沒有環,返回none

方法二:時間複雜度o(n),空間複雜度o(n),遍歷列表遇見的第乙個重複的點就是環的入口

# -*- coding:utf-8 -*-

class listnode:

def __init__(self, x):

self.val = x

self.next = none

class solution:

def entrynodeofloop(self, phead):

res =

while phead and phead.next:

if phead in res:

return phead

else:

phead = phead.next

return none

這類問題還可以延伸出來求

(1)環的長度、(2)整個鍊錶的長度、(3)兩個無環鏈表第一次相交的公共節點

(1)環的長度,當快慢指標第一次相遇的時候,把該節點儲存下來,讓慢指標接著走,當再次到達剛才相遇的節點時所走過的步數就是環的長度。

(2)利用第二步求出環以外的長度再加上環的長度,就是整個鍊錶的長度

(3)先分別求出兩個鍊錶的長度,讓長的鍊錶先走兩個鍊錶長度差的步數,再讓兩個鍊錶一起走,當走到節點相同的那個節點時,就是相交的第乙個公共節點。

僅僅節點的值相等,並不是同一節點,還有node.next也相同,所以直接比較節點相同即可

鍊錶中環的入口節點

乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。思路 通過141題,我們知道可以通過快慢指標來判斷是否有環,現在我們假設兩個指標相遇在z點,如圖 那麼我們可以知道fast指標走過a b c b slow指標走過a b 那麼2 a b a b c b 所以a c 那麼此時讓slow回到起點,fast依然...

鍊錶中環的入口節點

題目描述 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。演算法描述 受之前的面試題的啟發,如果我們在乙個有環的鍊錶中設定兩個鍊錶指標,乙個快,乙個慢,那麼兩個鍊錶指標相遇的時候,必然是位於鍊錶中的某個結點,利用這個結點,當我們從這個結點開始繼續遍歷,當再一次回到這個結點的時候,我們可以統計出環中的結...

鍊錶中環的入口節點

題目描述 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。解題思路 假設x為環前面的路程 黑色路程 a為環入口到相遇點的路程 藍色路程,假設順時針走 c為環的長度 藍色 橙色路程 第一步 找環中相匯點。分別用p1,p2指向鍊錶頭部,p1每次走一步,p2每次走二步,直到p1 p2找到在環中的相匯點。此時...