快慢指针的使用!
import java.util.HashSet;
import java.util.Set;
public class _141_linked_list_cycle {
// 哈希查找
// 时间复杂度:O(n)
// 空间复杂度:O(n)
public boolean hasCycle1(ListNode head) {
Set<ListNode> set = new HashSet<>();
while (head != null) {
if (set.contains(head)) return true;
set.add(head);
head = head.next;
}
return false;
}
// 快慢指针
// 时间复杂度:O(n):
// 当链表中不存在环时,快指针将先于慢指针到达链表尾部,链表中每个节点至多被访问两次。
// 当链表中存在环时,每一轮移动后,快慢指针的距离将减小一。而初始距离为环的长度,因此至多移动 NN 轮。
// 空间复杂度:O(1)
public boolean hasCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) return true;
}
return false;
}
}