两个有序数组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[count] = nums2[n]; count--; n--; } else { nums1[count] = nums1[m]; count--; m--; } } } int main() { int num1[] = { 1,2,3,5,6,0,0,0 }; int num2[] = { 4,6,9 }; merge(num1, sizeof(num1) / sizeof(num1[0]), 5, num2, sizeof(num2) / sizeof(num2[0]), 3); for (int i = 0; i < sizeof(num1) / sizeof(num1[0]); i++) { printf("%d\n", num1[i]); } return 0; }
原文:https://www.cnblogs.com/zhm521/p/14105534.html