【Leetcode】141. 环形链表(Linked List Cycle)

No141. 环形链表

题目

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

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

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

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

示例1

【Leetcode】141.  环形链表(Linked List Cycle)

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

示例2

【Leetcode】141.  环形链表(Linked List Cycle)

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

示例3

【Leetcode】141.  环形链表(Linked List Cycle)

  • 输入:head = [1], pos = -1
  • 输出:false
  • 解释:链表中没有环。

提示

  • 链表中节点的数目范围是 [0, 104]
  • -105 <= Node.val <= 105
  • pos 为 -1 或者链表中的一个 有效索引 。

思路:

  • 头结点判空
  • 设置两个指针p和q分别指向head和head.next;
  • 设置循环条件,p,p.next,q,q.next均不为空,但p.next实际上已经由之前的条件筛选过,所以省去;
  • 设置循环内部语句,若p和q相同则返回True;否则p移动到下一个指针,q移动到下两个指针;
  • 循环结束后也要返回False,此时表示无环链表正常退出;

解题代码(Python3)

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        if not head:
            return False
        p = head
        q = head.next
        while p and q and q.next:
            if p == q:
                return True
            p = p.next
            q = q.next.next
        return False

复杂度分析:

  • 时间复杂度 O(n) 假设有环且最大,则p跑了一圈,q跑了两圈,实际上复杂度仍为线性
  • 空间复杂度 O(1)

运行结果:

【Leetcode】141.  环形链表(Linked List Cycle)

上一篇:超详细Prometheus入门教程!(内含141页可复制官方文档下载方式)


下一篇:NFS挂载失败,报No route to host