141. 环形链表
代码
ts
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function hasCycle(head: ListNode | null): boolean {
let a: ListNode | null = head;
let b: ListNode | null = head;
while(b && b.next){
a = a!.next;
b = b.next.next;
if(a === b){
return true;
}
}
return false;
}思路
使用快慢指针(Floyd 判圈算法)来检测链表中是否存在环:
初始化两个指针:
a(慢指针):每次移动一步b(快指针):每次移动两步
遍历链表:
- 如果快指针
b或b.next为null,说明链表无环,返回false - 如果快慢指针相遇(
a === b),说明链表有环,返回true
- 如果快指针
原理:
- 如果链表有环,快指针最终会追上慢指针
- 如果链表无环,快指针会先到达链表末尾
这是检测链表环的经典算法,也是后续题目(如 142 题)的基础。
- 时间复杂度
,其中 是链表的长度 - 空间复杂度