题目
Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
总结
我的代码:
public class Solution {
public boolean hasCycle(ListNode head) {
if (head == null) {
return false;
}
Map<ListNode, Integer> map = new HashMap();
map.put(head, 1);
ListNode current = head.next;
while(current != null) {
if (map.containsKey(current)) {
return true;
}
map.put(current, 1);
current = current.next;
}
return false;
}
}
思路是使用hash来保存已经遍历点的信息,判断一个点是否会被遍历两次
另一种思路:使用两个指针遍历链表,一个步长为1(指针i),一个步长为2(指针j),如果有循环那么两个指针会相遇。如果没循环,那么指针指向null时结束并范围false
时间复杂度分析:
只分析有循环的情况
假设链表总长度为N,可分为两部分,长度为C的无循环部分和长度为K的有循环部分。
首先指针i和j皆进入循环部分,用时为C,然后j追赶i,耗时 = 他们之间的距离 / 1(速度之差),这部分小于等于K,所以时间复杂度为C+K = N
代码:
public boolean hasCycle(ListNode head) {
if (head == null || head.next == null) {
return false;
}
ListNode slow = head;
ListNode fast = head.next;
while (slow != fast) {
if (fast == null || fast.next == null) {
return false;
}
slow = slow.next;
fast = fast.next.next;
}
return true;
}