>>>>>>>>>>>>>>>我使用了同余!!!点此了解 解题思路 及 数学原理!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
其他题解光讲原理不讲思路,知其然不知其所以然,这可不好。我来讲一讲解题的原理吧。
这道题的知识点其实是,但是用的知识点比较浅,主要考察的是思路。
预备知识
简单说一下同余。同余的形式一般如下:
它的意义其实很简单,熟悉编程的大家早就见过了,即:。
带入这个题中,设d为环的长度,说白了就是我们只关心游标在环的哪个节点上,不关心它套了多少圈。
设圈长为d,显然这道题里同余都是以为底的(即
),为了方便我后边就省略掉了。
解题思路
首先先判断有无环,使用经典快慢指针即可,反正出题人也没本事发明个新算法不是?
我们把具体情况画出来。其中,是列表头,
是环入口,
是快慢指针交汇的地方,
、
、
的长度分别为
、
、
。
然后诸位大可以开始拔头发考虑如何从已知的O、B点挪到A点。
推导
所以,我们能从快慢指针那里学到啥呢?
设慢指针的移动距离为,则由:1. 快指针速度是慢指针两倍、2. 慢指针最后落在了B点,可得:
由及
可得
。已知
,所以
。
既然,那把
盘到环上它就正好与
点重合!我在示意图中以
表示。单从套圈的角度来看,
等效于
。
可能有同学看到就兴奋了!没错!
,因此我们从
出发走
步就走到
了!(或者说,由
可知,走
等效于走
步)
那么如何走步呢? (边界条件:如果
就是
,那么就不用走了,直接返回
,退出)
很简单,嘛!两个慢指针分别从
、
出发,相交处就是
。
没反应过来?那这样看:。
不就代表着环的入口
嘛,至于两个指针要转几个圈圈才能遇到,我不管~~~
以上。