--- tags: leetcode --- # [141. Linked List Cycle](https://leetcode.com/problems/linked-list-cycle/) --- # My Solution ## Solution 1 ### The Key Idea for Solving This Coding Question Use hash set to record the visited nodes. Once find a visited node in the hash set, there is a cycle in the linked list. ### C++ Code ```cpp= /** * 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) { if (head == nullptr || head->next == nullptr) { return false; } unordered_set<ListNode *> visited; for (ListNode *it = head; it != nullptr; it = it->next) { auto iter = visited.find(it); if (iter != visited.end()) { // This node has been visited. Cycle detected! return true; } visited.insert(it); } return false; } }; ``` ## Time Complexity $O(n)$ $n$ is the number of nodes in the linked list referred by `head`. ## Space Complexity $O(n)$ ## Solution 2 (Floyd Cycle Detection Algorithm) ### The Key Idea for Solving This Coding Question ### C++ Code ```cpp= /** * 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) { ListNode *fast = head, *slow = head; while (fast != nullptr && fast->next != nullptr) { slow = slow->next; fast = fast->next->next; if (fast == slow) { return true; } } return false; } }; ``` ## Time Complexity $O(n)$ $n$ is the number of nodes in the linked list referred by `head`. ## Space Complexity $O(1)$ ## Solution 3 ### The Key Idea for Solving This Coding Question ### C++ Code ```cpp= /** * 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) { if (head == nullptr) { return false; } ListNode *curr = new ListNode(), *x = head->next; for (ListNode *it = head; it != nullptr; it = x) { if (it->next == curr) { return true; } x = it->next; it->next = curr; } return false; } }; ``` ## Time Complexity $O(n)$ $n$ is the number of nodes in the linked list referred by `head`. ## Space Complexity $O(1)$ ## Solution 4 (Brent Cycle Detection Algorithm) ### The Key Idea for Solving This Coding Question ### C++ Code ```cpp= /** * 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) { if (head == nullptr) { return false; } ListNode *fast = head, *slow = head; unsigned long steps = 2; while (fast != nullptr) { for (unsigned long i = 0; i < steps && fast != nullptr; ++i) { fast = fast->next; if (fast == slow) { return true; } } steps *= 2; slow = fast; } return false; } }; ``` ## Time Complexity $O(n)$ $n$ is the number of nodes in the linked list referred by `head`. ## Space Complexity $O(1)$ # Reference [探索 Floyd Cycle Detection Algorithm](https://hackmd.io/@eklipsorz/By-12SsEP) # Miscellaneous <!-- # Test Cases ``` [3,2,0,-4] 1 ``` ``` [1,2] 0 ``` ``` [1] -1 ``` ``` [1] 0 ``` ``` [] -1 ``` ``` [1,2] -1 ``` -->