LeetCode环形链表

LeetCode环形链表

LeetCode环形链表

两种思路

第一 : 想到判读重复问题,hash表是很好的结构,可以使用hashSet存储元素,可以判断是否出现过,

              空间复杂度O(n),时间复杂度O(n)

第二 : 双指针,追及问题,一个快一个慢,若存在环,快的指针必定会追上慢的指针

             空间复杂度O(n),时间复杂度O(1)

/**
 * 利用哈希表的特性。
 * tips: 哈希表是判断重复或者存储一个后面需要用到的数据的重要方法
 * @param head
 * @return
 */
public static boolean solution(ListNode head) {
    HashSet<ListNode> set = new HashSet<>();
    while (head != null){
        if (set.contains(head)){
            return true;
        }else {
            set.add(head);
            head = head.next;
        }
    }
    return false;
}
/**
 * 双指针
 * 快慢指针
 */
public static boolean solution2(ListNode head){
    if (head == null || head.next ==null){
        return false;
    }
    ListNode slow = head;
    ListNode fast = head.next;
    while (fast != slow){
        if (fast == null || fast.next == null){
            return false;
        }
        fast = fast.next.next;
        slow = slow.next;
    }
    return true;
}