力扣 | 141. 环形链表

快慢指针的使用!

力扣 | 141. 环形链表_第1张图片

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;
    }


}

你可能感兴趣的:(算法学习,计算机基础,编程语言,leetcode,链表,算法)