提要
这是一道根据面试题5:替换空格从后向前遍历的一道拓展题。
题目
给定两个有序整数数组 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]
思路
思路很清晰,从后向前遍历,如果num2大,则 n u m 2 − − num2-- num2−−,如果num1大,则 n u m 1 − − num1-- num1−−。设置一个最终的计数器k,将元素放在最终位置。需要注意的是,num1和num2不一定等长,存在一个数组遍历结束,另外一个没有结束的情况。循环结束后,需要将剩余部分拷贝到最终数组中。
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i=m-1;
int j=n-1;
int k=m+n-1;
//边界判断
if(m<=0)
nums1=nums2;
while(i>=0&&j>=0)
{
if(nums1[i]<nums2[j])
nums1[k--]=nums2[j--];
else if(nums1[i]>nums2[j])
nums1[k--]=nums1[i--];
else
nums1[k--]=nums2[j--];
}
while(i>=0)
{
nums1[k--]=nums1[i--];
}
while(j>=0)
{
nums1[k--]=nums2[j--];
}
}