【剑指Offer刷题小记】链表中环的入口节点(JAVA版)

题目描述:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

问题分析:设置快慢两个指针,从链表头节点出发,快指针每次走两步,慢指针每次走一步,则两个指针必相遇在链表的环里。相遇后分别从头节点和相遇节点继续出发,并且每次都只走一步,最后将在入口节点处相遇。


示意图

假设环之外的节点长度为x,入口节点到相遇节点的长度为m,相遇节点到入口节点的距离为n(顺时针方向距离),那么快指针所走路程为x+k(m+n)+m  (k>=1),慢指针所走路程为x+m。并且快指针所走路程是慢指针的两倍,即2(x+m)=x+k(m+n)+m,化简得到x=(k-1)(m+n)+n,即头节点到入口节点的距离等于 相遇节点到入口节点的距离加上环的长度,也就是最终会在入口节点相遇。

代码截图

你可能感兴趣的:(【剑指Offer刷题小记】链表中环的入口节点(JAVA版))