简介:龟兔赛跑算法,又称弗洛伊德循环检测算法,是一种在链表中非常常用的算法。它基于运动学和直觉的基本定律。本文旨在向您简要介绍该算法,并帮助您了解这个看似神奇的算法。
假设高速公路上有两辆车。其中一辆的速度为 x,另一辆的速度为 2x。它们唯一能相遇的条件是它们都在循环中。恭喜你,你刚刚学会了龟兔算法。
在龟兔算法中,我们让两个指针分别为慢指针和快指针(分别是乌龟和兔子)。快指针以 2 的速度移动(每次迭代移动两个节点),而慢指针以 1 的速度移动(每次迭代移动一个节点)。如果它们相遇,则意味着存在循环。
但是我们怎么知道这两个指针最终会相遇呢?
现在,我们知道慢速和快速都会在不同的时间进入循环。慢速的速度为 1,因此每次迭代只跳过一个链接。快速的速度为 2。因此每次迭代传递两个变量。因此,对于每次迭代,快速都会向慢速移动 1 步,并且由于慢速和快速进入循环时之间的距离总是可以被 1 整除,因此快速将在一次或更短的循环内赶上慢速。
您也可以换一种方式思考。认为慢速指针只是停留在一个位置,整个链表以 1 的速度移动。这意味着快速指针相对于慢速指针每次迭代仅以 1 个节点的速度移动。