题目:
给定一个链表的头节点 head
,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
代码:
思路:利用快慢指针,也就是快指针一次走两步,慢指针一次走一步,两个指针都从链表的起始位置开始运行,如果链表中带环一定会在环中相遇,如果链表中没有环,那么快指针一定会先一步走向链表结尾。
由二者距离相等,我们可以得出,把slow放到A位置,fast仍在C位置,两指针以相同速度出发,相遇的位置就是B(入口点)
public ListNode detectCycle(ListNode head) {
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;
}
//因为链表有环结束,开始进行环的初结点计算
slow=head;
while(slow!=fast){
slow=slow.next;
fast=fast.next;
}
return slow;
}