鍊錶中環的入口節點

2021-08-11 22:14:47 字數 906 閱讀 4741

題目描述:

乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。

解題思路:

假設x為環前面的路程(黑色路程),a為環入口到相遇點的路程(藍色路程,假設順時針走), c為環的長度(藍色+橙色路程)。

第一步:找環中相匯點。分別用p1,p2指向鍊錶頭部,p1每次走一步,p2每次走二步,直到p1==p2找到在環中的相匯點。

此時,p1走過的路程為

sslow = x + m * c + a,p2走過的路程為

sfast = x + n * c + a。

2 sslow = sfast

2 * ( x + m*c + a ) = (x + n *c + a)

從而可以推導出:

x = (n - 2 * m )*c - a

= (n - 2 *m -1 )*c + c - a

即環前面的路程 = 數個環的長度(為可能為0) + c - a

什麼是c - a?這是相遇點後,環後面部分的路程。(橙色路程)

第二步:找環的入口。讓指標p2從起點a開始走,讓指標p1從相遇點b開始繼續往後走,2個指標速度一樣,均走一步,那麼,當從原點的指標走到環入口點的時候(此時剛好走了x),從相遇點開始走的那個指標也一定剛好到達環入口點。

時間複雜度:o(n)

空間複雜度:o(1)

c++實現**:

/*

struct listnode

};*/

class solution

if(p1==p2)

return p1;}}

return null;}};

鍊錶中環的入口節點

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

鍊錶中環的入口節點

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

鍊錶中環的入口節點

乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。struct listnode class solution listnode slow phead listnode fast phead while count while fast slow return fast listnode hasloop...