描述
判断给定的链表中是否有环。如果有环则返回true,否则返回false。
你能给出空间复杂度O(1)的解法么?
第一种解法 时间复杂度O(n) 空间复杂度O(n) 思路:遍历整个链表,将每个节点放入set集合中,再放之前判断当前集合是否存在将要放入的节点,如果存在就说明成环,反之,不成环
import java.util.Set;
import java.util.HashSet;
public class Solution {
public boolean hasCycle(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) 空间复杂度O(1) 思路:利用快慢指针的思想 快指针每次走两步,慢指针每次走一步,直到他们两个相遇说明成环,如果不成环,说明快指针不是指向null,就是它指向的下一个节点为null 。注意:if里面的||条件两者顺序必须保持一致,不然可能会报空指针异常的。
import java.util.*;
public class Solution {
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;
}
fast = fast.next.next;
slow = slow.next;
}
return true;
}
}