LeetCode 142. Linked List Cycle II【快慢指針】(Floyd判圈法)

題目描述

給定一個鏈表,如果有環路,找出環路的開始點。

解題思路

對於鏈表找環路的問題,有一個通用的解法——快慢指針(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;
    }
};
學如逆水行舟,不進則退
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章