- 第一步,找环中相汇点。分别用p1,p2指向链表头部,
- p1每次走一步,p2每次走二步,直到p1==p2找到在环中的相汇点。
- 那么我们可以知道fast指针走过a+b+c+b
- slow指针走过a+b
- 那么2*(a+b) = a+b+c+b
- 所以a = c
- 那么此时让slow回到起点,fast依然停在z,两个同时开始走,一次走一步
- 那么它们最终会相遇在y点,正是环的起始点
/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode detectCycle(ListNode head) { if(head==null || head.next==null){ return null; } ListNode fast=head; ListNode slow=head; while(fast!=null && fast.next!=null){ fast=fast.next.next; slow=slow.next; if(slow==fast){//利用快慢指针找相遇点 fast=head; while(fast!=slow){ slow=slow.next;//设置以相同速度的新指针从起始位置出发 fast=fast.next; } return slow; } } return null; } }