給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,輸出null。
分析:
此問題包含兩個步驟:
(1)判斷鏈表中是否有環
(2)找出環
一、
選擇快慢指針,讓快指針每次走兩步,慢指針每次走一步,若是單鏈表中有環的話,那麼兩個指針會相遇,此時可返回其在環中的相遇點。
二、
1)當相遇的時候,設慢指針在環中走了k步,設環之外的部分長爲x,環的長度爲c,則快指針一共走了 x+m1*c+k步,(m1爲快指針在環中走的圈數),慢指針一共走了x+m2*c+k(m2爲快指針在環中走的圈數)步,因爲快指針的速度是慢指針的兩倍。那麼可以得到2(x+m2*c+k)= x+m1*c+k;得到x爲m*c-k ,慢指針在圈中還剩下的步數c-k;
2)讓快指針從頭開始,兩個指針每次都走一步,當快指針走了x+(m*c-k)步的時候,到達環的入口,慢指針在圈中走m-1圈加k步的時候,也到達環入口那個節點,兩個指針再次相遇,此刻的節點就是環的入口的節點。
————————————————
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(!pHead||!pHead->next) return NULL;
ListNode* slow=pHead;
ListNode* fast=pHead;
while(fast!=NULL&&fast->next!=NULL){
fast=fast->next->next;
slow=slow->next;
if(slow==fast){
break;
}
}
fast=pHead;
if(fast==NULL||fast->next==NULL) return NULL;
while(fast!=slow)
{
fast=fast->next;
slow=slow->next;
}
return slow;
}
};