Leetcode 88. 合并两个有序数组 Python3
虽然是一道简单难度的题目,但是要想到这种方式还是不容易,看到官方的答案很赞,就加了很多注释和自己的理解,方便日后复习,同时能帮助其他人就更好啦!如有错误,欢迎指正
Python代码:
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
# 定义三个指针,从后遍历数组,如果遇到B中元素比A中大,就放到P指向的数组位置
p1 = m - 1
p2 = n - 1
p = m + n - 1
# 两个数组任意一个遍历完,就可以跳出循环
# 因为A遍历完,说明B中未遍历元素都比A中最小的元素还小,直接执行A[:p2 + 1] = B[:p2 + 1],将B中的元素都放到A中头部即可
# 如果B遍历完,说明B中的元素都添加到A中的对应位置了,数组合并结束;此时B遍历完成,p2 = -1,因此执行A[:p2 + 1] = B[:p2 + 1],相当于执行[] = [],不造成任何影响,所以nums1[:p2 + 1] = nums2[:p2 + 1]不需要任何条件判定;
while p1 >= 0 and p2 >= 0: # 边界判定:索引为0时,是列表的第一个的元素,是需要遍历的
# 如果B中当前元素大于A中当前元素,将B中当前元素移动到P处,并将p2向前移动一位
if nums1[p1] <= nums2[p2]: # 边界判定:当两者相等时,理论上放在p1的前后都可以,但是为了避免p1元素的移动,放在后面效率更高
nums1[p] = nums2[p2]
p2 -= 1
# 如果B中当前元素小于/等于A中当前元素,那么就将当前A中的元素移动到P处(其实就是往后移,为B中更小的元素留出前面的位置),并将p1向前移动一位
else:
nums1[p] = nums1[p1]
p1 -= 1
# 每次循环都将P向前移动,因为每次循环都伴随P的值发生变化,必须往前移,才能不断改变A中元素的位置,达到合并并排序的目的
p -= 1
# 针对A可能先遍历完的情况,直接把B中剩余元素放到A的头部位置
nums1[:p2 + 1] = nums2[:p2 + 1]
302


&spm=1001.2101.3001.11974&articleId=108651491&d=1&t=3&u=421d8b9677bf4952a028e5fd932bed82)

被折叠的 条评论
为什么被折叠?



