141.环形链表
题目描述
给你一个链表的头节点head,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos 来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos 不作为参数进行传递。仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回true。否则,返回false。
示例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 或者链表中的一个 有效索引 。
题目详解
上一道题目是求中间节点,我们使用slow和fast求解,这道题解法是类似的
由于slow每次走一步错,fast走2步。相对速度是2步,那如果存在环形的话,fast和slow必定会相遇
完整代码
# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = NoneclassSolution:defhasCycle(self,head:Optional[ListNode])->bool:slow=head fast=headwhilefastandfast.next:slow=slow.nextfast=fast.next.nextiffastisslow:# 有环形一定会相遇returnTruereturnFalse# 时间复杂度O(n),空间复杂度O(1)同类型题目leetcode142是输入环形的入口,具体解法见下一篇,后续会陆续出leetcode的题目解题过程,喜欢的小宝可以点赞收藏关注喔