劍指offer之鏈表中找環問題

題目:給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,輸出null。

解題思路:定義倆個快慢指針,同時指向鏈表的頭指針,快指針每次走倆步,慢指針每次走一步,當快慢指針相遇的時候,此時證明鏈表中有環,然後將快指針指向頭指針,然後快指針和慢指針同時走,每次走一步,當快慢指正再次相遇的時候,此時這個結點就是環的入口結點。

代碼示例如下:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead)
    {
        if(pHead==NULL||pHead->next==NULL)   
        {
        	 return NULL;
        }   
                
        ListNode* fast = pHead;
        ListNode* slow = pHead;
        
        while(fast && fast->next)
        {
            fast = fast->next->next;//快指針每次走倆步
            slow = slow->next;      //慢指針每次走一步
            if(fast == slow)        //此時證明鏈表中存在環
            {
                fast = pHead;  
                break;              //結束,跳出循環
            }
                 
        }
        while(fast != slow)
        {
             fast = fast->next;
             slow = slow->next;
        }
        return fast;                //此時,slow和fast相遇,這就是環的入口結點
    }
};

測試結果如下:
牛客網測試

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