题目描述
给定两个有序数组,把两个数组合并为一个。
输出样例
输入是两个数组和它们分别的长度 m 和 n。其中第一个数组的长度被延长至 m + n,多出的
n 位被 0 填补。题目要求把第二个数组归并到第一个数组上,不需要开辟额外空间。
Input: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
Output: nums1 = [1,2,2,3,5,6]
思路
本题重点是原地整合。
使用三个指针,从两个数组的尾部开始比较,把较大的元素插入到nums1的尾部位置。
(1)两个指针m-1和n-1,分别指向两个列表的尾部;
(2)还有一个指针指向要插入的位置,每次将较大的那个数字复制到 nums1 的后边,然后向前移动一位。
c++代码
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:8.7 MB, 在所有 C++ 提交中击败了77.72%的用户
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
// 定义三个指针
int i = m - 1;
int j = n - 1;
int pos = m + n - 1;
while (i >= 0 && j >= 0)
{
if (nums1[i] <= nums2[j]) // 把大的插入到nums1尾部
{
nums1[pos] = nums2[j];
j--; // 下一个比较位置
}
else
{
nums1[pos] = nums1[i];
i--; // 下一个比较位置
}
pos--; // 下一个插入位置
}
while (j >= 0)
{
nums1[pos] = nums2[j];
j--;
pos--;
}
}
};
python代码
执行用时:12 ms, 在所有 Python 提交中击败了93.81%的用户
内存消耗:13.3 MB, 在所有 Python 提交中击败了5.44%的用户
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 # num1尾部位置
j = n - 1 # num2尾部位置
pos = m + n - 1 # 要插入的位置
while i >= 0 and j >= 0: # 都没有比较完,则继续
if nums1[i] <= nums2[j]:
nums1[pos] = nums2[j] # 较大的插入到nums1尾部
j -= 1
else:
nums1[pos] = nums1[i]
i -= 1
pos -= 1 # 下一个插入位置
# 如果nums1没有比完,则不需要动了,nums1前面本身有序的
while j >= 0:
nums1[pos] = nums2[j]
pos -= 1
j -= 1
return nums1