快慢指针法
-
核心思想:
- 快慢指针 :
- 使用快慢指针(
fast
和slow
)遍历链表。 - 快指针每次移动两步,慢指针每次移动一步。
- 如果链表存在环,快指针最终会追上慢指针(相遇)。
- 使用快慢指针(
- 找到环的入口 :
- 当快慢指针相遇时,初始化一个新指针
ptr
,指向链表头节点。 - 同时移动
ptr
和slow
,每次移动一步,直到它们相遇。 - 相遇的节点就是环的入口节点。
- 当快慢指针相遇时,初始化一个新指针
- 快慢指针 :

上面思路和图解来自灵茶山艾府
-
时间复杂度:
- 最坏情况下需要遍历整个链表,时间复杂度为
O(n)
,其中n
是链表的节点数。
- 最坏情况下需要遍历整个链表,时间复杂度为
-
空间复杂度:
- 只使用了常数级别的额外空间,空间复杂度为
O(1)
。
- 只使用了常数级别的额外空间,空间复杂度为
python
class Solution:
def detectCycle(self, head):
slow = fast = head # 初始化慢指针和快指针,都指向链表头节点
while fast is not None: # 当快指针不为空时
slow = slow.next # 慢指针每次移动一步
if fast.next is None: # 如果快指针的下一个节点为空
return None # 说明链表没有环,返回 None
fast = fast.next.next # 快指针每次移动两步
if fast == slow: # 如果快慢指针相遇
ptr = head # 初始化一个新指针,指向链表头节点
while ptr != slow: # 当新指针和慢指针不相遇时
ptr = ptr.next # 新指针每次移动一步
slow = slow.next # 慢指针每次移动一步
return ptr # 返回新指针指向的节点(即环的入口节点)
return None # 遍历结束,没有发现环,返回 None