2019年9月1日
LeetCode 88. Merge Sorted Array
C++, LeetCode, 算法, 编程
0 Comments
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]
解析:
对于给定的两个有序数组,将第二个数组内容合并到数组1中。
解法1:
从前往后处理,分布设置两个指针i,j指向两个有序数组,从数组1中i位置开始找到数组2中元素不满足小于关系的位置,将nums1中所有后面元素后移,将nums2中j元素插入i位置。具体代码如下:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i=0, j =0;
for(; j < n; j++)
{
while(nums2[j] >= nums1[i] && i < m)
i++;
for(int k=nums1.size()-1; k > i; k--)
{
nums1[k] = nums1[k-1];
}
nums1[i] = nums2[j];
m +=1;
}
}
};
解法2:
从后往前处理,从nums1和nums2的最后一个元素开始比较,然后将二者较大的放置于nums1最后一个位置,其余依次类推。这个思路更简洁。代码如下:
class Solution {
public:
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;
while(i >=0 && j >= 0)
{
if(nums1[i] > nums2[j])
nums1[k--] = nums1[i--];
else
nums1[k--] = nums2[j--];
}
while(j>=0)
nums1[k--] = nums2[j--];
}
};
运行结果:
