两个有序数组nums1、nums2,数组元素个数为m、n,将nums2合并到nums1中,使nums1成为有序数组,假设nums1有足够的空间。

//第一次尝试:
//本题
//第一种办法是将两个数组合并之后在进行排序,就好了;
//第二种办法是设置两个标志位a、b,然后将a从nums1的首位开始,将b从nums2的首位开始,然后开始遍历nums1和nums2,比较nums[a]和nums2[b],
// 然后将小的数放到一个新开辟的空间num,再然后将小的数的标志位++,直到遍历完毕,如果某个数组先遍历完,那么只需将另一个数组剩余元素放到num中即可;
//第三种也就是我写的这个办法,第二种办法重新开辟了新的空间,不够完美,其实我们可以将第二种改进一下,我们将元素从后往前放到nums1数组(num1足够大),
// 具体方法还是和第二种一样设置两个标志位a、b,将a从nums1的最后一个元素开始,b从nums2的最后一个元素开始,然后比较nums[a]和nums2[b],
// 将大的数放到num1中的count=m+n-1的位置上,让后count--,大数的标志位--,直到遍历完毕,如果某个数组先遍历完,那么只需将另一个数组剩余元素放到num中即可;

#include<stdio.h> #include<stdlib.h> void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) { int count = m + n - 1; m--, n--; while (m >= 0 && n >= 0) { if (nums1[m] < nums2[n]) {
//从nums1的m+n-1的位置开始存放较大的数据, nums1[count]
= nums2[n]; count--; n--; } else { nums1[count] = nums1[m]; count--; m--; } } while (n >= 0) {
//如果nums1遍历完了,nums2还没遍历完,就将nums2的数据依次放到nums1中 nums1[count]
= nums2[n]; count--; n--; } } int main() { int num1[] = { 1,2,3,6,0,0,0,0,0 }; int num2[] = { 3,4,6,7,9 }; merge(num1, sizeof(num1) / sizeof(num1[0]), 4, num2, sizeof(num2) / sizeof(num2[0]), 5); for (int i = 0; i < sizeof(num1) / sizeof(num1[0]); i++) { printf("%d\n", num1[i]); } return 0; }