力扣刷题(python)50天——第二十五天:合并两个有序数组
题目描述
给定两个有序整数数组 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]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法
最简单的方法应该是合并排序,但是值得注意以下两者的区别:
nums1[:] = sorted(nums1[:m] + nums2)
nums1 = sorted(nums1[:m] + nums2)
若为第二个,则会将nums1变量原来的值舍去,nums1地址会发生变化。
但这种方法并没有用到题中数据是有序这一条件
因此采用双指针的方法:
解答
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.
"""
nums3=nums1[:m]
i=0
j=0
k=0
while 1:
if i>=m and j>=n:
break
elif i>=m:
nums1[k]=nums2[j]
j+=1
k+=1
elif j>=n:
nums1[k]=nums3[i]
i+=1
k+=1
elif nums3[i]<nums2[j]:
nums1[k]=nums3[i]
i+=1
k+=1
else:
nums1[k]=nums2[j]
j+=1
k+=1
执行结果
改进:
双指针还能采用由后向前的方法:
这样不用设置nums3来表示,减少空间占用。
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: void Do not return anything, modify nums1 in-place instead.
"""
# two get pointers for nums1 and nums2
p1 = m - 1
p2 = n - 1
# set pointer for nums1
p = m + n - 1
# while there are still elements to compare
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
# add missing elements from nums2
nums1[:p2 + 1] = nums2[:p2 + 1]
作者:LeetCode
链接:https://leetcode-cn.com/problems/merge-sorted-array/solution/he-bing-liang-ge-you-xu-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。