
描述
判断给定的链表中是否有环。如果有环则返回true,否则返回false。
数据范围:链表长度 0 ≤ n ≤ 10000 0 leq n leq 10000 0≤n≤10000
要求:空间复杂度 O ( 1 ) O(1) O(1),时间复杂度 O ( n ) O(n) O(n)
输入分为2部分,第一部分为链表,第二部分代表是否有环,然后回组成head头结点传入到函数里面。-1代表无环,其他的数字代表有环,这些参数解释仅仅是为了方便读者自测调试。实际在编码时读入的是链表的头节点。
示例1
输入:{3,2,0,-4},1
返回值:true
说明:第一部分{3,2,0,-4}代表一个链表,第二部分的1表示,-4到位置1,即-4->2存在一个链接,组成传入的head为一个带环的链表 ,返回true
示例2
输入:{1},-1
返回值:false
说明:第一部分{1}代表一个链表,-1代表无环,组成传入head为一个无环的单链表,返回false
示例3
输入:{-1,-7,7,-4,19,6,-9,-5,-2,-5},6
返回值:true
Python实现
# class ListNode:# def __init__(self, x):# self.val = x# self.next = None## # @param head ListNode类 # @return bool布尔型#class Solution: def hasCycle(self , head ): # write code here # 判断链表是否为空,或只有一个Node if head is None or head.next is None: return False else: # 创建一个空list,用来存放每个Node # 如果某个Node被再次放入,则存在有环 # cache = [] cache = set() # 用set比list更快 while head: # 在cache中则存在有环 if head in cache:return True # 不在cache中则放入 # cache.append(head) cache.add(head) head = head.next return False# slow = head# fast = head# while (fast != None and fast.next != None):# slow = slow.next# fast = fast.next.next# if fast == slow:# return True# return False
使用set的效率(时间快,但空间消耗大):
使用list的效率(时间慢,但空间消耗小):
不使用新空间的效率(时间快,空间消耗也小):