linked-list-cycle-ii (數學證明)
阿新 • • 發佈:2018-11-01
題意:略.
這個題最關鍵的點在於後面,如何找到迴圈開始的節點。
第一階段,先用快慢指標找到相遇的節點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; } };