鏈表--判斷是否有環,並給出環的入口鏈表

給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,輸出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;
    }

};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章