题目
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
解析
首先要判断这个链表有没有环,可以定义两个指针p1,p2 让p1每次走两步p2每次走一步,如果p1能追上p2就说明有环,如果p1访问到空就没有环。
然后找到环中有几个节点,就让p1往前走直到遇到p2。循环的次数就是节点的个数。
然后把两个指针都指向头节点。让p1先走环的次数的步数 ,然后p1,p2以相同速度走。相遇的节点就是环的入口节点。
c#代码
public class ListNode
{
public int val;
public ListNode next;
public ListNode (int x)
{
val = x;
}
}
class Solution
{
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if (pHead == null)
return null;
if (pHead.next == pHead)
return pHead;
ListNode p1, p2;
p1 = p2 = pHead;
//判断有没有环
while(p1.next!=null)
{
p1 = p1.next;
if (p1 == p2)
break;
p1 = p1.next;
if (p1 == p2)
break;
p2 = p2.next;
}
if (p1.next == null)
return null;
//找到环中有多少节点
int num = 0;
p1 = p1.next;
num++;
while(p1!=p2)
{
p1 = p1.next;
num++;
}
p1 = p2 = pHead;
for (int i = 0; i < num; i++)
p1 = p1.next;
while(p1!=p2)
{
p1 = p1.next;
p2 = p2.next;
}
return p1;
}
}