每天一道LeetCode-----判斷連結串列是否有環,如果有,找到環的入口位置
阿新 • • 發佈:2021-12-06
題目連結
思路
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; } };