環形鍊錶2 找入環結點)

2021-09-11 05:14:44 字數 991 閱讀 3761

思路:針對這個題,需要分情況討論。有環存在和無環存在兩種情況。

如何確定鍊錶是否帶環?可以利用快慢指標的思路(定義乙個快指標,乙個慢指標,初始位置都放在煉表表頭的位置,讓快指標每次走兩步,慢指標每次走一步,若快指標走到了null,則說明這個鍊錶沒有環。若快指標沒有走到null而且慢指標追上了快指標,此時,兩個指標一定處於環內,則說明這個鍊錶帶環)來確定是否帶環的問題。

若帶環,例如下圖:

設a為煉表頭結點的位置,b為入環結點的位置,c為兩個指標相遇的位置。

當快慢指標相遇的時候,在煉表頭的位置(a點)再放乙個指標pcur,讓慢指標和pcur指標同時開始走,每次走一步,當慢指標和pcur指標相遇時,指標剛好處於入環結點的位置( b點)。

可如下證明:

設(長度)ab=l,

bc=x,

環長為r,

cb=r-x.

當快慢指標相遇在c點的時候,慢指標走過的路程(長度)為:l+x, 快指標走過的路程(長度)為:l+x+nr(n為未知數,是大於0的整數)。

則可以得出:(慢指標走的路程是快指標走的路程的二分之一)

2(l+x)=l+x+nr

2l-l=x-2x+nr

l=nr-x

l=(n-1)r+(r-x)

思路清晰以後,寫**就簡單了

struct listnode ;

struct listnode *detectcycle(struct listnode *head)

}if (fast == null || slow == null|| fast->next == null )

while (pcur!=slow)

return cur;

}

鍊錶的入環結點

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。以下為分析過程為 左程雲 程式設計師 面試指南 it名企演算法與資料結構題目最優解 中的解析 如果乙個鍊錶沒有環,那麼遍歷鍊錶一定可以遇到鍊錶的終點 如果鍊錶中有環,那麼遍歷鍊錶就永遠在環裡轉下去了。如何找到第乙個入環結點,具...

142 環形鍊錶2

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。說明 不允許修改給定的鍊錶。示例 1 輸入 head 3,2,0,4 pos 1 輸出...

力扣141 環形鍊錶 142環形鍊錶2

方法一 雜湊表 思路及演算法 最容易想到的方法是遍歷所有節點,每次遍歷到乙個節點時,判斷該節點此前是否被訪問過。具體地,我們可以使用雜湊表來儲存所有已經訪問過的節點。每次我們到達乙個節點,如果該節點已經存在於雜湊表中,則說明該鍊錶是環形鍊錶,否則就將該節點加入雜湊表中。重複這一過程,直到我們遍歷完整...