题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路
首先判断链表中是否有环,设置两个指针,一个一次走一步,另一个一次走两步,若链表中存在环,则两个指针一定会相遇,否则输出null
有环,找出环的入口节点,当两节点第一次相遇后,让其中一个指针指向头结点,每次走一步,再次相遇时的节点就是入口节点。推导可自行百度。
代码
public ListNode EntryNodeOfLoop(ListNode pHead){
ListNode p1 =pHead;
ListNode p2 = pHead;
while(p1!=null && p2!=null){
p1 = p1.next;
if(p2.next == null){
return null;//p2.next ==null 时, 其next报错
}
p2 = p2.next.next;
if(p1 == p2){//有环
p2 = pHead;
while(p1 != p2){
p1 = p1.next;
p2 = p2.next;
}
return p1;
}
}
return null;
}