[LeetCode] Linked List Cycle
阿新 • • 發佈:2017-10-07
public {} red etc lin nbsp log 每次 使用
Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
帶環鏈表的檢測,使用快慢指針判斷,快指針每次走兩步,慢指針每次走一步,如果快慢指針相遇,則鏈表有環,否則快指針會一直走到nullptr為止退出循環,返回false。
在有環的情況下,最終快慢指針一定都走在環內。
/** * 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; ListNode* fast = head; ListNode* slow = head; while (fast->next != nullptr && fast->next->next != nullptr) { fast= fast->next->next; slow = slow->next; if (fast == slow) return true; } return false; } }; // 16 ms
在無環情況下,時間復雜度為O(n / 2)
在有環情況下,最壞情況下O(n)最好情況下O(n / 2)
總的時間復雜度O(n)
還可以使用map來存儲出現的節點,如果一個鏈表有環,則遍歷鏈表時必然有節點會遍歷2次。利用map中出現第二次的元素可以判斷出該鏈表有環。
這需要O(n)的空間復雜度
/** * 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) { unordered_map<ListNode*, int> m; while (head != nullptr) { if (m.count(head)) { return true; } else { m[head]++; } head = head->next; } return false; } }; // 13 ms
[LeetCode] Linked List Cycle