1. 第一步,找环中相汇点。分别用p1,p2指向链表头部,
  2. 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;
       }
    }