这是环形链表的升级版,也就是找到尾部连接的第二个节点并返回;
分两步:第一步判断是否有环,第二步找到节点
为什么找到节点是这样?原因是快慢指针相遇之后,慢指针到head的距离和新指针q到head的距离相同,这是作为慢指针p1和新指针q再一起动,相遇的点就是入口点
public ListNode detectCycle(ListNode head) {
if (head == null || head.next == null)
return null;
ListNode p1 = head, p2 = head;
int tag = 0;//标记是否有环
while (p2 != null) {
p1 = p1.next;
if (p2.next == null) {
tag = 0;
break;
} else {
p2 = p2.next.next;
}
if (p1 == p2) {
tag = 1;
break;
}
}
if (tag == 0) {
return null;
} else {
ListNode q = head;
while(p1 != q){
p1 = p1.next;
q = q.next;
}
return q;
}
}