Linked List Cycle II
题目描述:
Given a linked list, return the node where the cycle begins. If there is no cycle, return
null
.
题目分析:
在上一篇博文中是直接判断链表是否有环路,而这个题目加深难度,要求找环路开始节点。其实,在上一篇算法的基础上,先找到快指针与慢指针相遇的节点,然后一个指针指向这个节点,这个指针与头指针同步向后一步一步移动,直到两指针相遇,那么相遇的节点就是环路开始的节点。
public ListNode detectCycle(ListNode head) {
if(head==null||head.next==null)
return null;
ListNode p1=head;
ListNode p2=head;
while(p1!=null&&p2!=null&&p2.next!=null){
p1=p1.next;
p2=p2.next.next;
if(p1==p2)
break;
}
if(p2!=null&&p2.next!=null){
while(head!=p1){
head=head.next;
p1=p1.next;
}
return p1;
}
return null;
}