一.原题如下
二.解题思路
- 这道题的解决方法是使用快慢指针(即相对而行),同时指向头节点
- 快指针走两步,慢指针走一步
- 如果最终快慢指针相等了(即相遇了),说明存在环;反之不存在环
三.复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(1)
四.完整题解
具体步骤请查看每个关键步骤的代码注释
public class Solution {
public boolean hasCycle(ListNode head) {
// 定义快慢指针
ListNode slow = head, fast = head;
// 慢指针走一步,快指针走两步
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
// 如果快慢指针走到一起了,也就是相等了,说明有环
if (slow == fast) {
return true;
}
}
// fast或者fast.next存在null值了,说明无环
return false;
}
}