题目描述:
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
解题思路:
如上图,我们可以使用快慢指针的方法来解决该问题。快指针走两步,慢指针走一步,然后如果说链表存在环的话,就应该两个指针最终会相遇;假设相遇的点为p,并且假设环的入口为q。那么在相遇点p就会有快指针所走的路程是慢指针的两倍;可以得到表达式:2(a+b)=(a+nb+(n-1)c);可以得到a=c;根据这个表达式,我们可以再新增一个指针,让新增指针指向链表头部,然后头部指针和指向p点的慢指针一起以相同的速度走,这样最终两个指针相遇的点就是链表环的入口点。
代码实现:
/*
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||pHead.next==null){return null;}
ListNode fast=pHead;
ListNode low=pHead;
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
low=low.next;
if(fast==low){
ListNode key=pHead;
while(key!=low){
key=key.next;
low=low.next;
}
return key;
}
}
return null;
}
}