快慢指针,也叫佛洛依德算法
即使用一个快指针,每次前进2位,慢指针每次前进1位,如果存在环,
则快慢指针必然会在环的开始处相交(可以参考追及问题)
时间O(n),空间O(1)
public boolean hasCycle(ListNode head) { // 首先确保后续节点存在 if (head==null || head.next==null) return false; ListNode fast=head.next,slow=head; // 快指针速率为慢指针2倍,如存在环则必然双指针必然相交 while(fast!=slow){ // 如果快指针能够抵达终点,那么肯定不存在环 if (fast==null || fast.next==null) return false; fast=fast.next.next; slow=slow.next; } return true; }