1.本题知识点
链表
2. 题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
3. 思路
分为2步,用2个指针实现:
① 找环中相遇点:指针p1每次循环走1步,p2每次走2步。如果找不到相遇点,无环输出null。
②找环的入口:在①基础上,p2移到head,然后p1和p2每次走1步,直到相遇即为入口。
③ 关于这个找入口的算法思路还有其他的方式,比如剑指上的思路是:
No.1 先求环的长度n,然后让p1不动,p2走n步,然后同时每次走一步,相遇点即为入口。
No.2 如果知道了环中相遇点,那环长度就很容易求了,比如,可以用计数的方式求长度。
No.3 其实这些思路都大同小异,都需要考虑2个指针,指针走几步和环的长度问题。
Java版本:
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead == 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;
}
return p1;
}
}
return null;
}
}