今天的题目是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