Skip to content

Latest commit

 

History

History
92 lines (72 loc) · 2.19 KB

141.环形链表.md

File metadata and controls

92 lines (72 loc) · 2.19 KB

141. 环形链表

url

题目

给定一个链表,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

如果链表中存在环,则返回 true 。 否则,返回 false

你能用 O(1)(即,常量)内存解决此问题吗?

circularlinkedlist-lc-q9kmLK

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

circularlinkedlist_test2-lc-i5Xwi1

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

方法

挺简单的:快慢指针

code

js

let hasCycle = head => {
    if (head === null) return false;
    let l1 = head, l2 = head.next;
    while (l2 !== null && l2.next !== null) {
        if (l1 === l2)
            return true;
        l1 = l1.next;
        l2 = l2.next.next;
    }
    return false;
}

go

func hasCycle(head *ListNode) bool {
    if head == nil {
        return false
    }
    l1, l2 := head, head.Next
    for l2 != nil && l2.Next != nil {
        if l1 == l2 {
            return true
        }
        l1 = l1.Next
        l2 = l2.Next.Next
    }
    return false;
}

java

public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null) {
            return false;
        }
        ListNode l1 = head, l2 = head.next;
        while (l1 != null && l2 != null && l2.next != null) {
            if (l1 == l2) {
                return true;
            }
            l1 = l1.next;
            l2 = l2.next.next;
        }
        return false;
    }
}