链表:https://leetcode-cn.com/problems/linked-list-cycle
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
进阶:你能用 O(1)(即,常量)内存解决此问题吗?
最简单的方法就是通过哈希表来进行判断了,通过循环遍历所有的节点,同时通过哈希表来存储已经遍历的节点,每遍历一个节点,就判断当前节点是否存在于哈希表中,如果存在,则说明是环形链表,直接返回 True,反之就把当前节点存储到哈希表中。
时间复杂度:O(n),对于含有 n 个元素的链表,我们访问每个元素最多一次,添加一个节点到哈希表中只需要花费 O(1) 的时间,最坏情况下我们需要遍历每个节点一次。
空间复杂度:O(n),空间取决于添加到哈希表中的节点数目,最坏的情况需要将每个元素都插入哈希表中。
class Solution:
def hasCycle(self, head: ListNode) -> bool:
hash={}
while head :
if head not in hash:
hash[head]=0
head=head.next
else:
return True
return False
思路:
注意:返回 True 位置的那个节点,并不一定是环的入口节点。
代码提供了两种写法,只是微小的差别,只是 fast 的初始位置不同而已。
class Solution:
def hasCycle(self, head: ListNode) -> bool:
if not head or not head.next:
return False
slow,fast=head,head.next
while fast and fast.next: # 如果没有fast.next,无法通过case ([1,2],-1).
if slow == fast:
return True
slow,fast=slow.next,fast.next.next
return False
class Solution:
def hasCycle(self, head: ListNode) -> bool:
slow=fast=head
while fast and fast.next: # 如果没有fast.next,无法通过case ([1] -1).
fast=fast.next.next
slow=slow.next
if fast == slow:
return True
return False
如果觉得文章不错,希望大家可以关注我噢,点赞、收藏、在看、分享就再好不过了。如果有任何建议和问题,可以在下方给我留言,我会不定期更新更多的文章,祝我们终将自由。