思路
- 首先判断链表是否存在环,如果不存在直接返回null(快慢指针判断链表是否有环博客链接)
- 从两个快慢指针交汇的地方到入环节点的距离和从链表第一个节点到入环节点的距离是相同的
- 创建两个引用cur1,cur2,分别指向链表的第一个节点和快慢指针交汇的地方,两个引用重合的地方便是链表的入环节点
代码
public class Solution11 {
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(fast==slow){
break;
}
}
if(fast==null||fast.next==null){
//说明链表是不带环的
return null;
}
ListNode cur1=head;
ListNode cur2=fast;
while(cur1!=cur2){
cur1=cur1.next;
cur2=cur2.next;
}
return cur1;
}
}