leetcode141. Linked List Cycle

本文探讨了链表中是否存在环的两种高效检测方法:通过修改链表节点和使用快慢指针。这两种方法均实现了O(n)的时间复杂度和O(1)的空间复杂度。文章详细介绍了每种方法的实现思路及Python代码,并对比了它们的优劣。
摘要由CSDN通过智能技术生成

这篇说得挺好的
https://blog.csdn.net/liuchonge/article/details/73520414
两种方法都是O(n)时间和O(1)空间,根据思想用python写了一遍


  • 法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
        """
        if head==None:
            return False
        cur=head
        post=cur.next
        while post:
            cur.next=head
            cur=post
            post=cur.next
            if post==head:
                return True
        return False

  • 法二 快慢指针
class Solution(object):
    def hasCycle(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        if head==None or head.next==None:
            return False
        fast=low=head
        while fast:
            try:
                low=low.next
                fast=fast.next.next
            except  :
                return False
            if fast==low:
                return True
        return False
  • 其中快慢指针我已经修改成了带一点点EAFP的思想的,但是还是没有discussion上面的大佬写得好啊T.T
#高票代码
def hasCycle(self, head):
    try:
        slow = head
        fast = head.next
        while slow is not fast:
            slow = slow.next
            fast = fast.next.next
        return True
    except:
        return False

大概的思想就是:除了slow==fast能表明有环以外,其他任意的情况(fast行走过程中遇到了None,或者head是空指针
)都表明无环

EAFP(easier to ask for forgiveness better than permission)原则和LBYL(look before you leap)原则在python的Glossory上都有,具体的例子见stackoverflow的一个回答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值