描述
判断给定的链表中是否有环。如果有环则返回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的效率(时间慢,但空间消耗小):
不使用新空间的效率(时间快,空间消耗也小):