題目描述
給定一個鏈表,如果有環路,找出環路的開始點。
解題思路
對於鏈表找環路的問題,有一個通用的解法——快慢指針(Floyd判圈法)。給定兩個指針, 分別命名爲 slow 和 fast,起始位置在鏈表的開頭。每次 fast 前進兩步,slow 前進一步。如果 fast 可以走到盡頭,那麼說明沒有環路;如果fast可以無限走下去,那麼說明一定有環路,且一定存 在一個時刻slow和fast相遇。當slow和fast第一次相遇時,我們將fast重新移動到鏈表開頭,並 讓slow和fast每次都前進一步。當slow和fast第二次相遇時,相遇的節點即爲環路的開始點。
AC
/**
* 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 *slow = head,*fast = head;
do{
//看fast是否走到鏈表結尾,進而判斷是否存在環路
if(!fast||!fast->next) return NULL;
fast=fast->next->next;
slow=slow->next;
}while(slow!=fast);
//如果存在,找節點位置
fast=head;
while(slow!=fast){
fast=fast->next;
slow=slow->next;
}
return fast;
}
};
學如逆水行舟,不進則退