天天看点

NC4 判断链表中是否有环 python

描述

判断给定的链表中是否有环。如果有环则返回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的效率(时间快,但空间消耗大):

NC4 判断链表中是否有环 python

使用list的效率(时间慢,但空间消耗小):

NC4 判断链表中是否有环 python

不使用新空间的效率(时间快,空间消耗也小):

NC4 判断链表中是否有环 python