Leetcode 142. 環形鏈表 II【快慢指針法求環的起點】

問題描述

給定一個鏈表,返回鏈表開始入環的第一個節點。 如果鏈表無環,則返回 null。

爲了表示給定鏈表中的環,我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鏈表中沒有環。

說明:不允許修改給定的鏈表。

解題報告

圖片來源 所參考的資料。

設快慢指針第一次相遇時,慢指針移動距離爲 tt,快指針移動距離爲 2t2*t

t=x+k1n+yt=x+k1*n+y
2t=x+k2n+y2*t=x+k2*n+y
進過變換我們可得:
x=(k22k11)n+(ny)x=(k2-2*k1-1)*n+(n-y)

左邊的含義是從 head 到達入口點;右邊的含義,n-y 就是相遇點到入口點的距離,(k2-2*k1-1)*n 就是轉 (k2-2*k1-1) 圈。
也就是說,從相遇點走到入口點,然後轉 (k2-2*k1-1)圈後再次回到入口點的這段時間內,剛好就等於從 head 走向入口點的時間。

實現代碼

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode *fast=head,*slow=head,*entry=head;
        while(fast!=NULL&&fast->next!=NULL&&fast->next->next!=NULL){
            fast=fast->next->next;
            slow=slow->next;
            if(fast==slow){
                while(slow!=entry){
                    slow=slow->next;
                    entry=entry->next;
                }
                return entry;
            }
        }
        return NULL;
    }
};

參考資料

[1] Leetcode 142. 環形鏈表 II【快慢指針法求環的起點】
[2] 快慢指針找環入口

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