給定鏈表頭節點,判斷鏈表中是否有環。若存在環,快慢指針最終會相遇。
slow 每次走 1 步。fast 每次走 2 步。nullptr。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;
}
slow=fast=head 或 head->next 均可,邏輯一致。fast && fast->next 確保 fast->next->next 安全。slow == fast。相遇後,將一指針重置為 head,兩指針同速 (1步/輪) 前進,再次相遇點即為環入口。證明基於路程關係:a = c + (n-1)(b+c)。
fast 走完;有環時 slow 進環後最多繞環一圈相遇。LeetCode 141 是快慢指針檢測環的教科書級例題。此模板廣泛適用於「鏈表環檢測、數字序列循環檢測 (如快樂數)、函數圖找環」等問題。掌握「相遇後找入口」延伸技巧可解決 LeetCode 142。