问题描述
示例
方法一: 双指针归并
将两个数组采用归并的方式排序,排序过程存放在res中,然后最后将res中的值复制到nums1中即可。写的时候一直卡在边界上,后来都单独拎出来处理然后就过了。
c代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
// nums2为空的情况
if(n == 0) return;
int res[m+n]; //用来临时存储归并的过程
int i, j, k;
i = j = k = 0; // i和j分别为num1和num2对应的指针
while(1){
//其中一方全部被写入res数组中
if(i == m){ // nums1被全部写入res中,则把nums2中剩余的写入即可
for(;j < n; j ++){
res[k] = nums2[j];
printf("j: %d res[%d]: %d \n",j, k, res[k]);
k ++;
}
break;
}
if(j == n){ // nums2被全部写入res中,则把nums1中剩余的写入res中
for(; i < m; i ++){
res[k] = nums1[i];
printf("i: %d res[%d]: %d \n",i, k, res[k]);
k ++;
}
break;
}
// 归并
if(nums1[i] <= nums2[j]) {
res[k] = nums1[i];
i ++;
} else {
res[k] = nums2[j];
j ++;
}
k ++;
}//while
// 最后把res中的数全部复制到nums1中即可
for(i = 0; i < m + n; i ++)
nums1[i] = res[i];
}
go代码
func merge(nums1 []int, m int, nums2 []int, n int) {
sorted := make([]int, 0, m+n)
p1, p2 := 0, 0
for {
// 当有一方遍历完之后
if p1 == m {
sorted = append(sorted, nums2[p2:]...)
break
}
if p2 == n {
sorted = append(sorted, nums1[p1:]...)
break
}
// 归并
if nums1[p1] < nums2[p2] {
sorted = append(sorted, nums1[p1])
p1 ++
} else {
sorted = append(sorted, nums2[p2])
p2 ++
}
}
copy(nums1, sorted)
}
java代码
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1 = 0, p2 =0;
int[] sorted = new int[m+n];
int cur;
while(p1 < m || p2 < n){
if(p1 == m){
cur = nums2[p2++];
} else if(p2 == n){
cur = nums1[p1++];
} else if(nums1[p1] < nums2[p2]){
cur = nums1[p1++];
} else {
cur = nums2[p2++];
}
sorted[p1 + p2 - 1] = cur;
}
for(int i = 0; i < m+n; i++){
nums1[i] = sorted[i];
}
}
}