快慢指针找第一次相遇
相遇后慢指针回到起点
再每次快慢指针都走一步
再次相遇就是入口
public ListNode detectCycle(ListNode head) {
if(head == null || head.next == null) return null;
ListNode p = head ,q = head;
while(q != null && q.next != null){
p = p.next;
q = q.next.next;
if(p == q) break;
}
if(q == null || q.next == null) return null;
p = head;
while(p != q){
p = p.next;
q = q.next;
}
return p;
}