基础算法(Leetcode)刻意练习训练营:第九天打卡

今天的题目是141. 环形链表

检查链表是否有环的方法以前听过 快慢指针的方法。

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
    	# 如果链表为空或只有一个元素,直接返回没有环
        if not head or not head.next:return False
        # 定义2个指针 一个从头开始,一个从下一个位置开始
        slow,fast = head,head.next
        # 快指针到尾部之前循环
        while fast and fast.next:
            # 如果快指针被满指针追上,则说明有环
            if fast == slow:return True
            # 满指针向后一步
            slow = slow.next
            # 快指针向后两步
            fast = fast.next.next
        # 循环结束,则不是没有环
        return False

执行用时 :56 ms, 在所有 Python3 提交中击败了60.90%的用户
内存消耗 :16.6 MB, 在所有 Python3 提交中击败了13.61%的用户

看了一下别的解法,

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        if not head:
            return head
        # 设置一个列表用于存放已经走过的位置
        m = []
        # head不为空则循环
        while head:
        	# 如果在列表中找到之前走过的位置就表示有环
            if head in m:
                return True
            # 否则就把当前位置记录下来
            m.append(head)
            # 往后移动
            head = head.next
        # 循环完毕代表没环
        return False

Your runtime beats 5.11 % of python3 submissions
Your memory usage beats 23.78 % of python3 submissions (16.3 MB)

执行结果有点诧异,速度超级慢1092ms,是快慢指针20倍,后来想想,如果一个环比较大,单指针绕弯一圈的时间,比双指针要慢一倍,所以要循环更多次才能发现重复,然后空间竟然比双指针小,我本来想多一个数组存放极端情况空间不是要O(n)吗,这道题要求空间O(1),感觉这个方式也不是很合适。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值