思路1(代码如下):
1、首先,定义一个中间数组temp去存储两数组比较后的结果
2、依次遍历nums1和nums2,比较当前索引所指的值得大小,将小的放到temp数组中,直到有一个数组遍历完了
3、此时有一个数组遍历完了,另一个还没遍历完的数组剩余元素的值都大于等于已遍历完数组的最后一个元素的值,将没遍历完的元素直接接在temp数组后面就行了
4、将temp数组的各元素值,复制给nums1
思路2:
可以直接把数组nums2接在nums1后面,再对nums1进行排序
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
int temp[m + n];//定义一个中间数组存放排序数组
int i = 0, j = 0, k = 0;
while (i < m && j < n) {
if (nums1[i] <= nums2[j]) {
temp[k++] = nums1[i++];
} else {
temp[k++] = nums2[j++];
}
}
//将未遍历完的数组直接接到temp后面
while (i < m) {
temp[k++] = nums1[i++];
}
while (j < n) {
temp[k++] = nums2[j++];
}
//将temp数组复制到nums1
for(int i= 0;i < (m + n);i++)
nums1[i] = temp[i];
}
在这里我开始使用的是malloc去动态分配temp数组,但是运行后消耗时间相比直接定义数组慢太多
另一个问题就是动态分配后将temp数组复制到nums1,直接用了temp = nums1,让temp为nums1的首地址,不知道为什么不行