帶環鏈表 II
阿新 • • 發佈:2017-06-16
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 returnNULL; 13 slow = head; 14 while (slow != fast) { 15 slow = slow->next; 16 fast = fast->next; 17 } 18 return slow; 19 } 20 };
帶環鏈表 II