題目描述
給定一個鏈表,判斷鏈表中是否有環(huán)。
如果鏈表中有某個節(jié)點,可以通過連續(xù)跟蹤 next 指針再次到達,則鏈表中存在環(huán)。 為了表示給定鏈表中的環(huán),我們使用整數(shù) pos 來表示鏈表尾連接到鏈表中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鏈表中沒有環(huán)。注意:pos 不作為參數(shù)進行傳遞,僅僅是為了標(biāo)識鏈表的實際情況。
如果鏈表中存在環(huán),則返回 true 。 否則,返回 false 。
進階:
你能用 O(1)(即,常量)內(nèi)存解決此問題嗎?
示例 1:

image.png
輸入:head = [3,2,0,-4], pos = 1
輸出:true
解釋:鏈表中有一個環(huán),其尾部連接到第二個節(jié)點。
示例 2:

image.png
輸入:head = [1,2], pos = 0
輸出:true
解釋:鏈表中有一個環(huán),其尾部連接到第一個節(jié)點。
示例 3:

image.png
輸入:head = [1], pos = -1
輸出:false
解釋:鏈表中沒有環(huán)。
提示:
鏈表中節(jié)點的數(shù)目范圍是 [0, 104]
-105 <= Node.val <= 105
pos 為 -1 或者鏈表中的一個 有效索引 。
題解
使用快慢指針的思路,快指針每次走兩步,慢指針每次走一步,如果快慢指針能相遇,則代表有環(huán)。
public class Solution {
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 != null && fast == slow) {
return true;
}
}
return false;
}
}