LeetCode 88. 合并两个有序数组 Merge Sorted Array
Table of Contents
一、中文版
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
说明:
初始化 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]
二、英文版
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: The number of elements initialized in nums1 and nums2 are m and n respectively. You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. Example: Input: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 Output: [1,2,2,3,5,6] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/merge-sorted-array 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
三、My answer
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. """ l = m + n while m > 0 and n > 0: if nums1[m-1] > nums2[n-1]: nums1[l-1] = nums1[m-1] m -= 1 else: nums1[l-1] = nums2[n-1] n -= 1 l -= 1 if n > 0: for i in range(n): nums1[i] = nums2[i] print(nums1) return nums1 """ [1,2,3,0,0,0] 3 [2,5,6] 3 [1,2,0,0,0] 2 [2,5,6] 3 [2,5,6,0,0,0] 3 [1,2,3] 3 [2,5,6,0,0,0] 3 [5,7] 2 """
四、解题报告
代码中注释部分是测试用例,LeetCode中我比较喜欢的一点就是可以同时测试多个,目前 lintcode 还不支持。
本算法算是一种逆向思维 —— 从后往前填满数组,而不是从前往后排,因为这样会遍历和移动多次数据,而从后往前只需要遍历 nums1 nums2 各一次。
比较 nums1 nums2 的数,谁大就放在所需位置,并向前移动一位指针。
如果最后剩的是 nums1 没遍历完,即 nums2 已全部插入 nums1 中,则不需要做任何操作,因为本来就是在 nums1 中的,剩下没遍历到的也是 nums1 的数。
但如果是剩的是 nums2,则说明原来的 nums1 已不在原位,需要把剩余的 nums2 的数填补到 nums1 的开头(因为从后往前遍历,剩下的位置是靠前的位置.)