1. 程式人生 > >linked-list-cycle-ii (數學證明)

linked-list-cycle-ii (數學證明)

題意:略.

這個題最關鍵的點在於後面,如何找到迴圈開始的節點。

      第一階段,先用快慢指標找到相遇的節點C。(至於為什麼,瞭解一下歐幾里德拓展解決二元不定方程。)A是表頭。B是開始迴圈的位置。

      第一次階段的公式是: 2(x+y)=x+y+n(y+z);    注意一下:n表示快指標比慢指標多跑了n圈!

      那麼兩邊同時減去 x+y    則, x+y= n*(y+z);  注意:這裡y+z表示一整圈!則 x等於 (n-1)*y+n*z;  (仔細分析這個式子的含義)

      當n等於1時,是不是x=z,當n=2時,是不是相當於先跑一圈,A-B剩下的等於z,依次類推更大的n

      所以,當一個指標放在C點,第二個指標放在A點, 以相同的而速度向前推進時,相等處就是B點

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        if (head == NULL) return NULL;        //空表
        ListNode *slow = head;
        ListNode *fast = head;
        while (fast&&fast->next){
            slow = slow->next;    fast = fast->next->next;
            
if (slow == fast)break; //相遇 } if (fast == NULL || fast->next == NULL)return NULL; slow = head; while (slow != fast){ slow = slow->next; fast = fast->next; } return slow; } };