LeetCodeWithPython 141. 环形链表

本文介绍两种链表环检测方法:使用哈希表记录遍历过的节点,若再次遇到则存在环;采用快慢指针策略,快指针速度为慢指针两倍,若两者相遇则表明链表有环。

题目链接

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

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码初步

  • 思路:运用hash_table将当前节点放在哈希表中,如果后面遍历链表与哈希表的key作比较,存在则存在闭链。
# 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
        """
        hash_table = {}
        while head!=None:
            if head in hash_table:
                return True
            else:
                hash_table[head]=1
                head=head.next
        return False

在这里插入图片描述

代码欣赏

  • 思路来自leetcode官方题解:
    想象一下,两名运动员以不同的速度在环形赛道上跑步会发生什么?
    1.如果列表中不存在环,最终快指针将会最先到达尾部,此时我们可以返回 false
    2.列表中存在环形链表,把慢指针和快指针想象成两个在环形赛道上跑步的运动员(分别称之为慢跑者与快跑者)。而快跑者最终一定会追上慢跑者
# 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 head==None:
            return False
        slow= head
        fast=head.next
        while(slow!=fast):
            if(fast==None or fast.next==None):
                return False
            else:
                slow=slow.next
                fast=fast.next.next
        return True

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值