前言
森林里一年一度的赛跑大赛又开始了,乌龟和兔子又被分到了一组,这次乌龟还能跑过兔子吗?
比赛规则:
- 乌龟每次移动1个单元格,兔子每次移动2个单元格。
- 随机出现一条赛道,赛道可能为直线,也可能为含有环线。
- 如果乌龟和兔子跑进环形区域,则一直在环形区域内前进,直到相遇。
- 乌龟和兔子都很正经,只往前走,不会后退,也不会相互放水。
根据以上规则,写出程序,判断乌龟是否可以追上兔子(能否相遇)。
思路解析
从比赛规则中可以看出,如果赛道是直线的话,乌龟和兔子是不能相遇的(起点除外)。
所以,乌龟和兔子能否和兔子相遇的关键点在于赛道是否含有环状区域。
这里我们用到“快慢指针”的概念。
快慢指针
快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。
直线赛道
如果是直线赛道,因为兔子比乌龟走的快,只需要判断兔子是否能跑完整个赛道就可以了。
例如,直线赛道由以下节点组成,定义两个指针,兔子为快指针,乌龟为慢指针,如果快指针的下一个节点为Null
,说明是直线型赛道,这种情况乌龟是追不上兔子的。
环形赛道
如果是环形赛道,例如下图,其中10的下一个节点为5,在这里形成了一个环,一旦进入这个环中是没办法出去的