题目:

给定两个已经排序的整数数组nums1和nums2,将nums2合并到nums1中,使之成为一个有序的数组。

nums1和nums2中的元素个数分别为m和n,nums1中有足够的空间来存放nums2中的元素。

思路:

构造一个大小为m+n的数组arr,然后开始遍历nums1(用nums1[i]表示)和nums2(用nums2[j]表示),

如果nums1[i] < nums2[j],就把nums1[i]填入arr中,否则将nums2[j]填入arr中;

如果nums1和nums2中有一个已经遍历完了,就把另一个数组剩下的元素直接填入arr。

最后把arr中的元素回填入nums1,完毕。

#include <stdio.h>
#include <stdlib.h>

void merge(int* nums1, int m, int* nums2, int n) {
    int* arr = malloc(sizeof(int) * (m+n));
    int i = 0, j = 0, k = 0;
    while (i<m && j<n) {
        if (nums1[i] < nums2[j]) {
            arr[k] = nums1[i];
            i++;
        }
        else {
            arr[k] = nums2[j];
            j++;
        }
        k++;
    }
    while (i < m) {
        arr[k] = nums1[i];
        i++;    k++;
    }
    while (j < n) {
        arr[k] = nums2[j];
        j++;    k++;
    }
    for (i=0; i<k; i++) 
        nums1[i] = arr[i];
}

int main()
{
    int nums1[100] = {3, 5, 7, 11, 23};
    int nums2[4] = {1, 4, 9, 10};
    merge(nums1, 5, nums2, 4);
    for (int i=0; i<9; i++) {
        printf("%d ", nums1[i]);
    }
    printf("\n");
    return 0;
}

结果:

效率还是很不错的。

其实用插入排序也是可以的,但是效率比较低。


参考:一起玩算法03

推荐一位干货up主:正月点灯笼