题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
解题思路:
首先判断链表是否为空,为空直接返回空;
然后,将头节点分别赋给两个指针;
判断list1是否为空,若为空,直接返回null,否则,让list1先向前移动两个位置,让list2移动一个位置;
若有环,此时list1和list2相等,并且list1不为空或者list2不为空,接下来,记录环节点的个数,直到list1和list2再次相等,环节点的个数记录完毕;
接下来,让list1和list2都再次指向头指针,并让list1先移动环节点个数个位置,然后list1和list2再以相同的速度向前移动,每次移动一个位置,当list1再次和list2相等的时候,就是要求的链表的环的入口节点。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead == null){
return null;
}
ListNode list1 = pHead;
ListNode list2 = pHead;
do{
list1 = list1.next==null?null:list1.next.next;
list2 = list2.next;
if(list1 == list2 && list1!=null){
int i = 0;
do{
list1=list1.next;
i++;
}while(list1!=list2);
list1 = pHead;
list2 = pHead;
for(int j=0;j<i;j++){
list1=list1.next;
}
while(list1!=list2){
list1=list1.next;
list2=list2.next;
}
return list1;
}
}while( list1!= null||list2!=null);
return null;
}
}