面试经典150题-1-合并两个有序数组-力扣88

151 阅读2分钟

合并两个有序数组-力扣88

问题描述

image.png

示例

image.png

方法一: 双指针归并

将两个数组采用归并的方式排序,排序过程存放在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];
        }
    }
}