1. 程式人生 > >[LeetCode] Linked List Cycle

[LeetCode] Linked List Cycle

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