首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode 141:環形鏈表判斷 — 快慢指針法

     編輯:關於C++

題目描述

給定一個單鏈表,判斷其中是否存在環。進階要求:不使用額外空間(O(1) 空間)。

解題思路:Floyd 判圈算法(快慢指針)

  • 慢指針 slow 每次移動 1 步,快指針 fast 每次移動 2 步。
  • 若鏈表無環,fast 終將遇到 nullptr。
  • 若有環,fast 會在環內追上 slow,兩者相遇。

參考代碼 (C++)

/**
 * 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) return false;
        ListNode *slow = head, *fast = head;
        while (fast && fast->next) {
            slow = slow->next;
            fast = fast->next->next;
            if (slow == fast) return true;
        }
        return false;
    }
};

複雜度分析

  • 時間複雜度:O(n) —— 最多遍歷鏈表長度 + 環長度。
  • 空間複雜度:O(1) —— 僅兩個指針。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved