52、鏈表中環的入口結點

題目描述:

  給一個鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,輸出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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章