1. 程式人生 > >帶環鏈表 II

帶環鏈表 II

list fas lin 每次 cycle cnblogs 有環 註意 pre

單鏈表,問有沒有環,若有,找到環的入口.

Lintcode上挑戰,只許使用常數的空間.

設一個快指針fast,一個慢指針slow,fast每次走2步,slow每次走1步.

若無相遇找到了鏈尾,則無環,若相遇了,則有環.

設從鏈頭到環入口點走了a步,從環入口到相遇點走了x步,環長r.相遇時,slow走了s步,fast走了2s步.

有:

s=a+x, 2s=a+nr+x.

所以a+x=nr->a=nr-x.

註意理解a=nr-x.意思是從鏈頭走到環入口的 步數=再走n圈,並退x步.那剛好也在環入口.

 1 class Solution {
 2 public:
 3     ListNode *detectCycle(ListNode *head) {
4 ListNode *slow = head, *fast = head; 5 while (fast && fast->next) { 6 slow = slow->next; 7 fast = fast->next->next; 8 if (slow == fast) 9 break; 10 } 11 if (!fast || !fast->next) 12 return
NULL; 13 slow = head; 14 while (slow != fast) { 15 slow = slow->next; 16 fast = fast->next; 17 } 18 return slow; 19 } 20 };

帶環鏈表 II