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、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。