数组:合并数组

1. 合并2个有序的数组

给你两个按 非递减顺序 排列的整数数组 

nums1
 和 
nums2
,另有两个整数 
m
 和 
n
 ,分别表示 
nums1
 和 
nums2
 中的元素数目。

请你 合并 

nums2
 到 
nums1
 中,使合并后的数组同样按 非递减顺序 排列。

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 输出:[1,2,2,3,5,6] 解释:需要合并 [1,2,3] 和 [2,5,6] 。 合并结果是 [_1,2,2,3_,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

解法1:使用额外空间存储合并后的结果

双指针,找到2个数组中更小的放入到新的数组中;

最后将新数组赋值给

nums1

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        nums = []
        i,j = 0,0
        while i < m and j < n:
            if nums1[i] <= nums2[j]:
                nums.append(nums1[i])
                i += 1
            else:
                nums.append(nums2[j])
                j += 1
        nums.extend(nums1[i:m])
        nums.extend(nums2[j:])
        nums1[:] = nums

解法2:从后向前原地赋值

需要3个指针:

  • i:指向
    nums1
    的m-1;
  • j:指向
    nums2
    的n-1;
  • k:指向
    nums1
    的最后一个元素;

找到

nums1
nums2
中最大的值,从后开始放入
nums1

要考虑到nums1、nums2已经遍历完的情况,如果用完了,则给一个最小值;(

-10**9
是题目中限定的数组最小值,并非int最小值)

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        i, j, k = m - 1, n - 1, m + n - 1
        while k >= 0:
            temp1 = nums1[i] if i >= 0 else -10**9
            temp2 = nums2[j] if j >= 0 else -10**9
            if temp1 >= temp2:
                nums1[k] = temp1
                i -= 1
            else:
                nums1[k] = temp2
                j -= 1
            k -= 1