題目描述:
給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,輸出null。
解題思路:
假設存在環,fast以速度2運行,slow以速度1運行,在slow走到入口t時,如圖(m1爲在slow首次到t時fast的位置,a爲h到t的距離,b爲t到m1的距離,n爲環的周長):
由圖知fast走的距離爲a+b+xn,slow走的距離爲a+b,又v(fast) = 2v(slow),所以x(fast) = 2x(slow),即2(a+b) = a+b+xn,因此a = xn-b,而m1逆時針到t的距離爲n-b。
Demo:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead){
ListNode *pslow = pHead;
ListNode *pfast = pHead;
while (pfast != nullptr && pfast->next != nullptr){
// 定義兩個快慢指針
pslow = pslow->next;
pfast = pfast->next->next;
// 記錄下第一次相遇的位置
if (pslow == pfast){
// 將慢指針指向頭結點
pslow = pHead;
while (pfast != pslow){
// 這次讓兩個指針前進的速度一樣,當他們再次相遇時,即爲入口結點
pslow = pslow->next;
pfast = pfast->next;
}
return pslow;
}
}
return nullptr;
}
};