1.题目
给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。
2.解法
fast走两步,slow走一步,因此fast走的长度是slow的两倍。相遇时就会出现以下关系。
从图中可以得知AB的长度= CB的长度。
因此,fast和slow相遇后,让head和slow一起走,那么相遇时即是入环点。

public ListNode EntryNodeOfLoop(ListNode pHead) {
ListNode fast = pHead;
ListNode slow = pHead;
ListNode p = pHead;
if(pHead==null||pHead.next==null) return null;
while (fast!=null&&fast.next!=null) {
fast = fast.next.next;
slow = slow.next;
if(fast==slow)
break;
}
if(fast==null||fast.next==null) return null;
while (p!=slow){
p = p.next;
slow = slow.next;
}
return p;
}
总结
fast走两步,slow走一步,因此fast走的长度是slow的两倍。
算法系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/alg
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。
链表环形入口节点检测算法
这篇博客介绍了如何通过快慢指针法解决寻找链表中环的入口节点问题。当快指针两次相遇时,将慢指针与头节点同时移动,两者相遇点即为环的入口。算法实现清晰,适用于链表数据结构的处理。

被折叠的 条评论
为什么被折叠?



