思路:
使用两个指针,快指针一次走两步,慢指针一次走一步。如果存在环,两个指针进入环以后,快指针一定可以追到慢指针,此时快慢指针处于同一个位置。如果不存在环,快指针会提前到达null结束的位置。
总结:
快慢指针。
代码:
public class Solution {
public boolean hasCycle(ListNode head) {
if(head == null) return false;
ListNode p1 = head.next, p2 = head;
while(p1 != null && p2 != null) {
// 如果相遇了,说明有环
if(p1 == p2) return true;
p2 = p2.next;
p1 = p1.next;
// 快指针提前到达了null, 说明没有环
if(p1 == null) break;
p1 = p1.next;
}
return false;
}
}
参考: