給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。
乙個帶環的鍊錶,設定兩個快慢指標,兩指標速度不同,一定會在環中相遇(類似在環形操場跑步,跑的快的的終究會追上跑的慢的,可能跑了好幾圈才追上),兩指標相遇時,快指標跑了n圈環ny+非環路程x+環入口到相遇點路程a(s_fast=x+ny+a),慢指標跑了m圈環my+非環路程x+環入口到相遇點路程a(s_slow=x+my+a),設v_fast=2v_slow,則2s_fast=s_slow,即2(s_fast=x+ny+a)=s_slow=x+my+a,求解x=(n- 2 *m -1 )*y + y- a,即非環路程x=整個環路程*s(s=0,1,...)+(整個環路程-環入口到相遇點路程),可將整個環路程*s忽略,得到x=y-a(整個環路程-環入口到相遇點路程)。
所以可以先讓快慢指標同時跑,一定會在環中相遇,然後將快指標重新置為原點,此時將兩指標速度調為一致,當兩指標相遇時,相遇點即為環的入口。
**
/*
struct listnode
};*/
class solution
listnode *fast=phead->next->next;
listnode *slow=phead->next;
while(fast!=slow)
else
return nullptr; //沒有環,直接返回nullptr
}fast=phead;
while(fast!=slow)
return slow;
}};
鍊錶中環的入口節點
乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。思路 通過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找到在環中的相匯點。此時...