1. 程式人生 > 其它 >每天一道LeetCode-----判斷連結串列是否有環,如果有,找到環的入口位置

每天一道LeetCode-----判斷連結串列是否有環,如果有,找到環的入口位置

題目連結

思路

1. 判斷一個連結串列是否有環,空間複雜度是O(1)

如果不考慮空間複雜度,可以使用一個map記錄走過的節點,當遇到第一個在map中存在的節點時,就說明回到了出發點,即連結串列有環,同時也找到了環的入口。

不適用額外記憶體空間的技巧是使用快慢指標,即採用兩個指標walker和runner,walker每次移動一步而runner每次移動兩步。當walker和runner第一次相遇時,證明連結串列有環

如果連結串列中有環,那麼當慢指標進入到環時,在未來的某一時刻,快慢指標一定可以相遇,通過這個也就可以判斷連結串列是否有環

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        auto walker = head;
        auto runner = head;
        while(runner && runner->next)
        {
            walker = walker->next;
            runner = runner->next->next;
            if(walker == runner)
                return true;
        }
        return false;
    }
};