No141. 环形链表
题目
给定一个链表,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。
你能用 O(1)(即,常量)内存解决此问题吗?
示例1
- 输入:head = [3,2,0,-4], pos = 1
- 输出:true
- 解释:链表中有一个环,其尾部连接到第二个节点。
示例2
- 输入:head = [1,2], pos = 0
- 输出:true
- 解释:链表中有一个环,其尾部连接到第一个节点。
示例3
- 输入: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)