经典面试题:两个有序数组合并为一个有序数组

时间:2025-05-14 07:29:04

经典面试题,将两个有序数组合并为一个有序数组。

实现思路

(1)while循环遍历两个数组(不破坏原数组,生成新数组)。
直到两个数组的计算的索引(i与j),其中任何一个大于自身数组的长度,终止循环

(2)正对比,错位对比。

因为两个数据都是有序的。故,只需按照元素值对比大小,然后取最大的值即可;

如果其中一个数组索引的元素值,小于另外一个数组索引的元素值,将最小的值放到newArr中;

并叠加最小值的索引值(列i++);

(3)元素值有3个对比(小于、大于、等于)。

小于,取小于的元素值,叠加小于的索引;

大于,取小于的元素值,叠加小于的索引;

等于,两个元素值都取,同时叠加两个索引;

代码

方法1

做递增标识i,j,不会对原数组产生影响。

function mergeSort(arr1, arr2) {
    var [i,j] = [0,0];
    let newArr = [];
    while(i <  || j <) {
        if (arr1[i] < arr2[j]) {
            (arr1[i]);
            i++
        } else if (arr1[i] > arr2[j]) {
            (arr2[j])
            j++
        } else {
            if(arr1[i]) (arr1[i]);
            if(arr2[j]) (arr2[j]);
            i++;
            j++
        }
    }
    return newArr
}

mergeSort([2,4,6,7], [1,2,3,5,8,9,10,33,44,49]);

方法2

每次循环移除原数组中元素,对元素组产生影响

function _mergeSort(arr1, arr2) {
    let newarr = [];
    while ( && ) {
        if (arr1[0] > arr2[0]) {
            (());
        } else if (arr1[0] < arr2[0]) {
            (());
        } else {
            (());
            (());
        }
    }
    if () {
        (...arr1);
    }
    if () {
        (...arr2);
    }
    return newarr;
}

_mergeSort([2,4,6,7], [1,2,3,5,8,9,10,33,44,49]);