LeetCode20—— 合并两个有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。
示例 1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
提示:
nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-109 <= nums1[i], nums2[i] <= 109
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array
方法一:
class Solution(object):
def merge(self, nums1, m, nums2, n):
"""
:type nums1: List[int]
:type m: int
:type nums2: List[int]
:type n: int
:rtype: None Do not return anything, modify nums1 in-place instead.
"""
i = m - 1 # 指针i用于存放nums1从右到左的指针
j = n - 1 # 指针j用于存放nums2从右到左的指针
pos = m + n - 1 # 指针pos用于存储比较i和j指针指向树枝的较大值
while i >= 0 and j >= 0:
# 如果nums1的最右边参数小于等于nums2最右边参数,将nums2最右边的值存储到pos所指向的位置,j指针和pos指针都向左移一位
if nums1[i] <= nums2[j]:
nums1[pos] = nums2[j]
pos -= 1
j -= 1
# 如果nums1的最右边参数大于nums2最右边参数,将nums1最右边的值存储到pos所指向的位置,i指针和pos指针都向左移一位
else:
nums1[pos] = nums1[i]
pos -= 1
i -= 1
# 如果最后nums1的i指针没有遍历到0,因为nums1是有序的。并且此时nums2的参数都已挪到了nums1,所以不用处理
# 如果最后nums2的j指针没有遍历到0,则需要将nums2剩余的参数按顺序填充到nums1开头
if j >= 0:
for z in range(0, len(nums2[:j + 1])):
nums1[z] = nums2[z]
# 返回nums1则为排序后的结果
return nums1
if __name__ == '__main__':
nums1 = [1,2,3,0,0,0]
m = 3
nums2 = [2,5,6]
n = 3
aa = Solution()
print(aa.merge(nums1, m, nums2, n))
方法二:
class Solution(object):
def merge(self, nums1, m, nums2, n):
"""
:type nums1: List[int]
:type m: int
:type nums2: List[int]
:type n: int
:rtype: None Do not return anything, modify nums1 in-place instead.
"""
nums1[m:] = nums2
nums1.sort()
return nums1
if __name__ == '__main__':
nums1 = [1,2,3,0,0,0]
m = 3
nums2 = [2,5,6]
n = 3
aa = Solution()
print(aa.merge(nums1, m, nums2, n))