题解 | #链表中环的入口结点#

链表中环的入口结点

http://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4

当链表有环时,获取脸变环的位置的方法: 1.先按有无环的判断流程,当快慢指针不相遇,则直接返回空 2.当快慢指针相遇时,快指针回到起点,慢指针呆在原地,快慢指针以相同的速度前进,下一次相遇的地点即为环的入口位置

推导过程:

x:链表中无环的长度 y:相遇点离环初始位置的距离 z:环剩下的距离

当快慢指针相遇时:

快指针运行了: x + n(y + z) + y

慢指针运行了: x + m(y + z) + y

m,n为整数

由于快指针是慢指针的两倍,有:

x + n(y + z) + y = 2 ( x + m(y + z) + y)

进一步求得:

x + y = (n -2m)(y + z)

其中,y + z 即为环的长度

此时快指针回到起点,慢指针呆在原地,假设快指针相遇时离初始位置S,当快慢指针以相同速度继续遍历,当再次相遇时,存在以下关系:

S + a(y + z) = b(y + z) - y

a,b亦为整数,当b=n、a=2m时,即为上式的结果,此时S = x, 即快慢指针再次相遇时正好处在环初始节点位置。

class Solution:
    def EntryNodeOfLoop(self, pHead):
        # write code here
        if pHead == None:
            return None

        fast = pHead
        slow = pHead
        is_ring = False
        while fast is not None and fast.next is not None:
            fast = fast.next.next 
            slow = slow.next 
            if fast == slow:
                is_ring = True
                fast = pHead
                break
        if is_ring:
            while fast != slow:
                fast = fast.next 
                slow = slow.next
            return fast 
        else: 
            return None
全部评论

相关推荐

沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
一名愚蠢的人类:多少games小鬼留下了羡慕的泪水
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
预计下个星期就能开奖吧,哪位老哥来给个准信
华孝子爱信等:对接人上周说的是这周
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务