1. 使用辅组数组

    import java.util.*;
    public class Solution {
    
     public ListNode EntryNodeOfLoop(ListNode pHead) {
         Set<ListNode> vector = new HashSet<>();
         ListNode p = pHead;
         while(true){
             if(p == null) return null;
             if(vector.isEmpty() || !vector.contains(p)){
                 vector.add(p);
                 p = p.next;
             }else{
                 return p;
             }
         }
     }
    }
  2. 使用快慢指针
    因为当两个指针相遇的时候,表示快指针跑过的距离为2倍慢指针距离,那么如题解中设x和y分别为慢指针走过的距离,那么快指针走过2x+2y,由于重复了一段距离y,且快指针也走过了x+y,那么未知距离为x,也就是等于入口的AB距离,故而重新设置快指针到初始位置,挨个遍历,到相遇即可。

    public ListNode EntryNodeOfLoop(ListNode pHead) {
     ListNode fast = pHead, slow = pHead;
     while(fast.next != null && slow.next != null){
         fast = fast.next.next;
         slow = slow.next;
         if(fast == slow) break;
     }
     if(fast == null || fast.next == null) return null;
     fast = pHead;
     while(fast != slow){
         fast = fast.next;
         slow = slow.next;
     }
     return fast;
    }