題目
給定一個鏈表,判斷鏈表中是否有環。
爲了表示給定鏈表中的環,我們使用整數 pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鏈表中沒有環。
示例 1:
輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:鏈表中有一個環,其尾部連接到第二個節點。
示例 2:
輸入:head = [1,2], pos = 0
輸出:true
解釋:鏈表中有一個環,其尾部連接到第一個節點。
示例 3:
輸入:head = [1], pos = -1
輸出:false
解釋:鏈表中沒有環。
進階:
你能用 O(1)(即,常量)內存解決此問題嗎?
解題思路
這道題目可以用快慢指針解決。
快指針每次走 2 步,慢指針每次走 1 步。如果快指針追上慢指針,則說明鏈表中存在環(就像 2 個人在操場上跑步,一個跑得快,一個跑得慢,跑得快的那個最終一定會追上慢的那個)。
代碼
class Solution {
/**
* 使用快慢指針,快指針每次走2步,慢指針每次走1步,如果快指針追上了慢指針,則說明存在環
*/
public boolean hasCycle(ListNode head) {
if (head == null || head.next == null) {
return false;
}
ListNode fast = head;
ListNode slow = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) {
return true;
}
}
return false;
}
}