zoukankan      html  css  js  c++  java
  • 快慢指针找链表环相关理论

    一、一定会相遇的证明

    1、如果链表没有环,那么快指针比慢指针先到达尾部(null)

    2、如果链表有环的话,因为快指针走的比慢指针快,所以在环中相遇的过程可以看作是快指针从环后边追赶慢指针的过程。

    用递归法证明,快慢指针一定会相遇:

    (1)快指针与慢指针之间差一步。此时继续往后走,慢指针前进一步,快指针前进两步,两者相遇。
    (2)快指针与慢指针之间差两步。此时继续往后走,慢指针前进一步,快指针前进两步,两者之间相差一步,转化为第一种情况。
    (3)快指针与慢指针之间差N步。此时继续往后走,慢指针前进一步,快指针前进两步,两者之间相差(N+1-2)即N-1步。重复这个过程,直到快指针和慢指针相遇。

    因此,此题得证。所以快指针必然与慢指针相遇。

    参考:
    作者:知乎用户
    链接:https://www.zhihu.com/question/23208893/answer/117115415
     

    推导:慢指针进入环后,快指针最多多绕一个圈。

    快指针F先进环,慢指针S后进。

    假设慢指针进环那一刻快指针差m步能追上(0<= m < Length),根据上边结论,两个指针走m次就会相遇了。

    因为m < Length,所以快指针在慢指针进环那一刻最多比慢指针多绕一个圈。

    二、环长度

    快指针和慢指针第一次相遇时的节点pq(碰撞点),快指针和慢指针从该点开始继续往前走,再次碰撞时所用的操作数就是环的长度Length

    证明:由上边的推导可得,这里的m为Lengh

    三、连接点

    假设慢指针进入环中时,即连接点p,快指针(q)需要m步才能追上慢指针。

    p和q第一次相遇时,碰撞点在pq处。此时,p走到pq时用了m步。

     假设head到p的距离为a,环长度为Length,慢指针走了s步,则快指针走了2s步。

    从上图可知:

    s = a + m

    2s = a + m + n * Length(n为快指针绕环的圈数)

    可得

    a = n * Length- m

    也就是:若在头结点和相遇结点分别设一指针,同步(单步)前进,则最后一定相遇在环入口结点p。

    可根据这个结论来找到入口节点。

    四、带环链表总长度

    找到连接点p后,求head到p的长度,再加上环的长度,即为链表的总长。

  • 相关阅读:
    Android软件开发之SharedPreferences
    android软件开发之获取本地音乐属性
    项目开发日记
    MVC中C给V传值
    wtf忘了已经安装了Newtonsoft.json
    我的一些容易忘记的解决问题的方法
    ajax请求返回null
    验证码的一些细节
    项目做不下去
    关于HttpContex
  • 原文地址:https://www.cnblogs.com/songdechiu/p/6686520.html
Copyright © 2011-2022 走看看