LeetCode 88. Merge Sorted Array

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--];
    }
};

运行结果:

Add a Comment

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据