题目描述
给定一个链表,判断链表中是否有环。
方法思路
双指针
一个指针每次移动一个结点,另一个指针每次移动两个结点,如果存在环,那么这两个指针一定会相遇。
代码
一些问题
- ‘\uffla’ 冒号写成中文的了
-
i != null && j != null && j.next != null判断循环结束条件
复杂度分析
时间复杂度: O(n),n 为链表中结点总数
考虑两种情况:
* 链表中不存在环:
-------快指针会首先到达链表尾部,其时间取决于链表的长度,即O(n)
* 链表中存在环:
我们将慢指针的移动过程划分为两个阶段:非环部分与环形部分:
1. 慢指针在走完非环部分后将进入环形部分:此时,快指针已经进入环中,迭代次数 = 非环部分长度 = N
2. 两个指针都在环形区域中:考虑两个在环形赛道上的运动员,其速度差值为 1 ,因此需要经过(二者之间距离)/(速度差值)次循环后,快跑者可以追上慢跑者。这个距离几乎就是“环形部分长度K”,且速度差值为1,所以 迭代次数 = 近似于K。
因此,最坏的情况下,时间复杂度为O(N+K),也就是O(n)。
空间复杂度: O(1)。只使用了快慢指针两个结点。