141. 环形链表[简单]

104 阅读1分钟

题目

给你一个链表的头节点 head ,判断链表中是否有环。

解法一

思路

快慢指针。 快的一次跑2步,慢的一次跑1步。如果没有环,一定到null了;如果有环,那么快慢指针总是能在环里相遇。

代码

    public boolean hasCycle(ListNode head) {
        if (head == null) {
            return false;
        }
        ListNode p1 = head;
        ListNode p2 = head.next;
        while (p2 != null && p1 != p2) {
            ListNode p = p2.next;
            if(p == null) {
                return false;
            }
            p2 = p.next;
            p1 = p1.next;
        }

        return p2 == null ? false : true;
    }

update20220509

    public boolean hasCycle(ListNode head) {
        if (head == null) {
            return false;
        }
        ListNode slow = head;
        ListNode fast = head.next;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
            if (slow == fast) {
                return true;
            }
        }
        return false;
    }

解法二

思路

遍历一遍,如果有重复出现,那么就是有环;否则肯定到null。

代码

    public boolean hasCycle(ListNode head) {
        Set<ListNode> set = new HashSet<>();
        ListNode p = head;
        while (p != null) {
            if (set.contains(p)) {
                return true;
            }
            set.add(p);
            p = p.next;
        }

        return false;
    }