实现过程如下(动图来源代码随想录)
- 首先寻找快慢指针相遇的地方
- 然后让慢指针固定此处,快指针指向了head
- 然后while(fast != slow)的时候,不停地移动两个指针,直到相遇
- 返回slow或者fast都可以
- 二刷:一开始的时候,一定要判断 fast == null || fast.next == null 的情况,否则会报空指针异常
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast = head, slow = head;
while(true){
//在此位置要判断当前结点和后一个结点是否有null
if(fast == null || fast.next == null) return null;
fast = fast.next.next;
slow = slow.next;
if(fast == slow) break;
}
fast = head;
while(fast != slow){
fast = fast.next;
slow = slow.next;
}
return fast;
}
}