合并两个有序数组
题目
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
解题思路
- 采用双指针的方法,从后面往前遍历
- 定义
p1
指针指向num1
数字末尾,p2
指向num2
数字末尾,p
指向num1
的最末尾; - 从后往前循环遍历比较两个数组之间元素的大小;
- 当
p < 0
时,也就是p1
和p2
其中一个小于 0,遍历结束; - 若是
num2
数组有剩余部分,因为数组都是有序的,直接将num2
数组剩余部分放到num1
数组对应的位置。
代码实现
class Solution:
def merge(self, nums1, m: int, nums2, n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
合并两个有序数组为一个有序数组
Args:
num1: 有序数组 1
m: num1 的元素数量
num2: 有序数组 2
n:num2 的元素数量
Returns:
返回合并后的有序数组
"""
# 通过双指针的方法,从后向前遍历的方法、
# 定义指针 p1 指向 num1 的数字末尾
# 定义指针 p2 指向 num2 的数字末尾
# 定义指针 p 指向 num1 的最末尾
p1 = m - 1
p2 = n - 1
p = m + n - 1
# 当 p 小于 0,即是 p1 和 p2 其中一个小于 0,遍历结束
while p1 >= 0 and p2 >= 0:
if nums1[p1] < nums2[p2]:
nums1[p] = nums2[p2]
p2 -= 1
else:
nums1[p] = nums1[p1]
p1 -= 1
p -= 1
# 两个数组都是有序的
# 若是 p1 先小于 0,将 num2 剩余部分放在 num1 数组前面
nums1[:p2 + 1] = nums2[:p2 + 1]
实现效果
以上就是本篇的主要内容