>>>>>>>>>>>>>>>我使用了同余!!!点此了解 解题思路 及 数学原理!<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

其他题解光讲原理不讲思路,知其然不知其所以然,这可不好。我来讲一讲解题的原理吧。
这道题的知识点其实是,但是用的知识点比较浅,主要考察的是思路。

预备知识

简单说一下同余。同余的形式一般如下:
它的意义其实很简单,熟悉编程的大家早就见过了,即:
带入这个题中,设d为环的长度,说白了就是我们只关心游标在环的哪个节点上,不关心它套了多少圈。
设圈长为d,显然这道题里同余都是以为底的(即),为了方便我后边就省略掉了。

解题思路

首先先判断有无环,使用经典快慢指针即可,反正出题人也没本事发明个新算法不是?
我们把具体情况画出来。其中,是列表头,是环入口,是快慢指针交汇的地方,的长度分别为
图片说明
然后诸位大可以开始拔头发考虑如何从已知的O、B点挪到A点。

推导

所以,我们能从快慢指针那里学到啥呢?

设慢指针的移动距离为,则由:1. 快指针速度是慢指针两倍、2. 慢指针最后落在了B点,可得:


可得 。已知,所以
既然,那把盘到环上它就正好与点重合!我在示意图中以表示。单从套圈的角度来看,等效于

可能有同学看到就兴奋了!没错!,因此我们从出发走步就走到了!(或者说,由可知,走等效于走步)

那么如何走步呢? (边界条件:如果就是,那么就不用走了,直接返回,退出)
很简单,嘛!两个指针分别从出发,相交处就是

没反应过来?那这样看:不就代表着环的入口嘛,至于两个指针要转几个圈圈才能遇到,我不管~~~

以上。