校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > 算法 > 链表算法
题目

如果单链表中是有环,请找到环的入口点

解答

思路

这是【单链表中是否有环,写出代码】的扩展题,可以划分到面试中难度最大的那一档中

没有思路,只能静下心来 

找环的入口点,就是找到入口点是链表的第几个结点,设这个结点q是第a个,

head到q的长度是a, 两个指针相遇时离入口点的距离为t, 链表长度为L,环的长度为r

如果相遇,设slow走了s步,则fast走了2s

可得 2s = s+ nr ( n >= 0)

=> s = nr => a + t = nr => a + t = (n-1)r + r 

=> a + t = (n -1)r + L – a => a = (n-1)r + (L – a – t) 

L – a – t 为相遇点到环入口点的距离

得到结论

设置两个指针,一个放在相遇点,一个放在链表头结点,当两者第一次相遇时,就得到环入口点P

实在不理解,可以只记住这个结论

代码

Node findLoopNode(Node head)
{ //先找到相遇点,与例三一致
Node slow = head, fast = head;

while ( fast && fast.next )
{
slow = slow.next;
fast = fast.next.next;
if ( slow == fast ) break;
}
if (fast == null || fast.next == null);
return null;
//从相遇点开始到与头结点相遇
slow = head;
while (fast != slow)
{
fast = fast.next;
slow = slow.next;
}
return fast;
}


C 7条回复 评论
期待

不会,啊啊,我是废物

发表于 2021-03-30 09:15:54
0 0
假期

两个指针,快和慢

发表于 2021-01-29 22:58:42
0 0
刘帅

两个指针,一个块一个慢

发表于 2021-01-29 11:19:42
0 0
五分i

两个指针,一个快一个慢。

发表于 2021-01-29 10:30:54
0 0
假期

两个指针,一个快一个慢,如果两个重叠就有环,否则没有

发表于 2021-01-22 23:32:19
0 0
刘帅

记录每一个next指针

发表于 2021-01-22 11:29:03
0 0
丹丹小小涛

记录每一个next指针 出现第二次的next指针则为入口 至于怎么记录 当然是使用hash 查找的时间复杂度为1 单链表遍历一遍就感觉出结果了

发表于 2021-01-22 10:54:52
0 0