跳到主要内容

141. 环形链表 [easy]

141. 环形链表 [easy]

https://leetcode-cn.com/problems/linked-list-cycle/

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

image

示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

image

示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

image

进阶:

  • 你能用 O(1)(即,常量)内存解决此问题吗?

通过次数182,407 | 提交次数376,004

Second Try

2020-07-07

真是一个没想到的方法,看题解才了解到的,还可以用快慢指针你追我赶来确定是否存在环,实现O(1)的空间使用。但我一遍还是不会用这种方法,用set空间换复杂度不挺好的吗?

# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None

class Solution(object):
def hasCycle(self, head):
"""
:type head: ListNode
:rtype: bool
"""
if not head:
return False
nodei = head
nodeii = head.next
while nodei and nodeii:
if nodei != nodeii:
nodei = nodei.next
if nodeii.next and nodeii.next.next:
nodeii = nodeii.next.next
else:
return False
else:
return True
return False

  • 执行用时:52 ms, 在所有 Python 提交中击败了24.31%的用户
  • 内存消耗:19.1 MB, 在所有 Python 提交中击败了9.09%

First Try

2020-07-07

普通的set写法,没什么特别的,就是空间使用是O(n), 没法达到O(1)的效果。

# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None

class Solution(object):
def hasCycle(self, head):
"""
:type head: ListNode
:rtype: bool
"""
# O(1)的算法?不知道怎么搞啊,或者直接在node上进行标记吗?
visited = set()
while head:
if head in visited:
return True
visited.add(head)
head = head.next
return False

  • 执行用时:56 ms, 在所有 Python 提交中击败了17.16%的用户
  • 内存消耗:19.7 MB, 在所有 Python 提交中击败了9.09%的用户