给定一个链表,判断链表中是否有环。3d
为了表示给定链表中的环,咱们使用整数 pos 来表示链表尾链接到链表中的位置(索引从 0 开始)。 若是 pos 是 -1,则在该链表中没有环。指针
示例 1:code
输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部链接到第二个节点。
示例 2:blog
输入:head = [1,2], pos = 0 输出:true 解释:链表中有一个环,其尾部链接到第一个节点。
示例 3:索引
输入:head = [1], pos = -1 输出:false 解释:链表中没有环。
进阶:你能用 O(1)(即,常量)内存解决此问题吗?内存
三种方法:
1,遍历整个链表,看能不能走到尾部NULL,若是有NULL则无环,若是没有NULL就多是有环,也可能链表太长会运行超时,这种方法不可取
2,用哈希表,依次遍历链表set存储走过的点 ———— 时间复杂度O(n),空间复杂度O(n)
3,快慢指针,若是有环快指针必定会追上慢指针,二者相遇即有环,快指针走到NULL即无环 ———— 时间复杂度O(n),空间复杂度O(1)it
经过代码以下:io
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None ## 哈希set,对比走过的点 class Solution: def hasCycle(self, head: ListNode) -> bool: s = set() while head: if head in s: return True s.add(head) head = head.next return False ## 时间复杂度O(n),空间复杂度O(n) ## 快慢指针,快指针一次走两步,慢指针走一步,若是有环快慢必定会相遇 # class Solution: # def hasCycle(self, head: ListNode) -> bool: # f = s = head # while f and f.next: # 必定是f.next不能为空,由于f走得快 # f = f.next.next # s = s.next # if f == s: # return True # return False ## 时间复杂度O(n),空间复杂度O(1)