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

今天的题目是21. 合并两个有序链表

从前两天负责的题目又回到了简单的列表,简单归简单,我的脑回路对指针有天然的弱势,这个题之前其实做过,今天第一眼看还是很闷,常见解法有递归和循环两种。

递归:

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        # 如果链1为空,返回链2
        if l1 is None:
            return l2
        # 如果链2为空,则返回链1
        elif l2 is None:
            return l1
        # 两者都不为空,比较值大小,如果链1小于链2
        elif l1.val < l2.val:
            # 链1的下一个节点,是把链1下一个节点的值和链2的函数返回值
            l1.next = self.mergeTwoLists(l1.next, l2)
            # 返回小值 也就是链1
            return l1
        else:
            # 如果链2小于链1的值,链2的下一个节点等于链2下一个节点和链1比较后的返回值
            l2.next = self.mergeTwoLists(l2.next, l1)
            # 返回小值 也就是链2
            return l2

执行用时 :40 ms, 在所有 Python3 提交中击败了68.12%的用户
内存消耗 :13.5 MB, 在所有 Python3 提交中击败了17.11%的用户

一个更简洁的python递归:
先交换然后递归。

        if l1 and l2:
            if l1.val > l2.val: l1, l2 = l2, l1
            l1.next = self.mergeTwoLists(l1.next, l2)
        return l1 or l2

第二种利用哨兵节点的循环:

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
    	# 初始化2个用于操作的指针和 哨兵节点head
        cur = head = ListNode(0) 
        # 当2个链表一个为空停止循环
        while l1 and l2:
        	# 如果链表1值 小于等于链表2值
            if l1.val <= l2.val:
            	# l1加到空链表后
                cur.next, l1 = l1, l1.next
            else:
            	# 反之,L2 加到空链表后
                cur.next, l2 = l2, l2.next
            # 指针后移一位
            cur = cur.next
        # 循环结束后l1或l2还有值,则把值加到最后面
        cur.next = l1 if l1 else l2
        # 返回哨兵节点后面的链表
        return head.next

执行用时 :32 ms, 在所有 Python3 提交中击败了95.84%的用户
内存消耗 :13.5 MB, 在所有 Python3 提交中击败了17.11%的用户

今天力扣的每日一题面试题57 - II. 和为s的连续正数序列

        i = 1 # 滑动窗口的左边界
        j = 1 # 滑动窗口的右边界
        sum = 0 # 滑动窗口中数字的和
        res = []

        while i <= target // 2:
            if sum < target:
                # 右边界向右移动
                sum += j
                j += 1
            elif sum > target:
                # 左边界向右移动
                sum -= i
                i += 1
            else:
                # 记录结果
                arr = list(range(i, j))
                res.append(arr)
                # 左边界向右移动
                sum -= i
                i += 1

        return res

执行用时:116 ms
内存消耗:13.3 MB

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值