美文网首页
环链表找入口原理证明

环链表找入口原理证明

作者: 路飞_Luck | 来源:发表于2020-10-31 23:26 被阅读0次
    一 目的
    • 定理推论证明
    二 定理推论证明
    image.png

    上述变量名称解释

    P1:链表的起点
    D:链表的环入口(假设链表有环)
    P2:快慢指针相遇的位置
    X:链表起点 P1 到环入口 D 的距离
    Y:链表环入口 D 到相遇节点 P2 的距离
    Z:快慢指针相遇点 P2 到环入口 D的距离
    C:链表环的距离,即 y + z
    
    开始证明

    假设快慢指针相遇时,快指针在环内走了m圈,慢指针在环内走了n圈,则有如下公式

    • 快指针总共走的距离为
     x + y + m * c
    
    • 慢指针总共走的距离为
    x + y + n * c
    

    假设快指针每次走2步,慢指针每次走1步,则快指针走过的距离是慢指针走过距离的2

    (x + y + m * c) = 2(x + y + n * c)                     结论1
    

    又因为环长为c = z + y,所以得出下面结论

    (x + y + m * c) = 2(x + y + n * c)   
    -> c(m - 2n) = x + y
    -> c(m - 2n) = x + c - z
    -> x = mc - 2nc - c + z
    -> x = (m - 2n - 1) * c + z        结论2
    
    image.png

    入上图所知,

    1. 假设 一个指针point1从起点出发,走了(m-2n-1)*c步到达了P1位置。
    2. 另外一个指针point2从相遇点P2开始出发,也走了(m-2n-1)*c步,最终还是停留在P1的位置(相当于绕环走了c圈而已)。
    3. 这个时候,第一个指针point1距离环入口的距离是z(由结论2得知),第二个指针point2距离环入口距离是z(之前的假设),所以两个指针再同时走z步,就会在环入口D处相遇
    结论

    要想知道环入口位置,只需先使用快慢指针,在环内找到相遇点P2,然后再让两个指针,一个从起点开始出发,一个从相遇点P2开始出发,每次走一步,最终相遇的地方,即为环入口D,走过的距离,也就是环入口的距离X,定理推论完毕。

    相关文章

      网友评论

          本文标题:环链表找入口原理证明

          本文链接:https://www.haomeiwen.com/subject/qlgsvktx.html