题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
解题思路:利用步数差,时间O(n),空间O(1):
首先,设立速度不同的两个指针,slow=1,fast=2;
若链表没有环,则fast指针或fast.next会指向null(其中对fast.next!=null的判断容易遗漏);
若有环,则快慢指针必然相遇,数学证明:假设从链表头到环入口距离是a,从环入口到碰撞点距离是b,从碰撞点回到环入口距离是c。则有2*(a+b)=a+K*(b+c)+b --> a=K*(b+c)+c。
此时快慢指针以同样的速度slow=fast=1前进,再次碰撞的点即为环的入口节点
Java代码:
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead){
// 1. 利用两个指针运动速率的不同来确定入口,他们俩从碰撞的节点后再次相遇的节点即为入口
/*
if(pHead==null || pHead.next==null) return null;
ListNode slow=pHead,fast=pHead;
while(fast!=null && fast.next!=null){
slow=slow.next;
fast=fast.next.next;
if(slow==fast) break;
}
if(fast==null || fast.next==null) return null;
slow=pHead;
while(slow!=fast){
slow=slow.next;
fast=fast.next;
}
return fast;
}}
同样也可利用Hash或Set进行求(链表大小较小时)