题目
一个链表中包含环,请找出该链表的环的入口节点。
思路
1.先判断链表中是否包含环 (快慢指针)
node1,node2指向头结点,node1每次向前移动1步,node2每次向前移动2步,若出现node1==node2,则有环,若node2==null,则无环
2.若链表中存在环,寻找环的入口节点
在1基础上,node2保持不动,node1指向头结点,然后node1和node2同时向前移动1步,当node1==node2时,则为环的入口节点(画图容易理解)
public class Solution {
ListNode EntryNodeOfLoop(ListNode pHead){
if(pHead == null || pHead.next == null)
return null;
ListNode p1 = pHead;
ListNode p2 = pHead;
while(p2 != null && p2.next != null ){
//快慢走
p1 = p1.next;
p2 = p2.next.next;
if(p1 == p2){ //相遇
//有环
p2 = pHead; //指向链表头结点
while(p1 != p2){
//同时走
p1 = p1.next;
p2 = p2.next;
}
if(p1 == p2) //相遇
//环的入口点
return p1;
}
}
return null;
}
}
网友评论