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

684 阅读2分钟

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

33333.png

实现思路

(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 < arr1.length || j <arr2.length) {
        if (arr1[i] < arr2[j]) {
            newArr.push(arr1[i]);
            i++
        } else if (arr1[i] > arr2[j]) {
            newArr.push(arr2[j])
            j++
        } else {
            if(arr1[i]) newArr.push(arr1[i]);
            if(arr2[j]) newArr.push(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 (arr1.length && arr2.length) {
        if (arr1[0] > arr2[0]) {
            newarr.push(arr2.shift());
        } else if (arr1[0] < arr2[0]) {
            newarr.push(arr1.shift());
        } else {
            newarr.push(arr1.shift());
            newarr.push(arr2.shift());
        }
    }
    if (arr1.length) {
        newarr.push(...arr1);
    }
    if (arr2.length) {
        newarr.push(...arr2);
    }
    return newarr;
}

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

结语

感谢您的阅读!希望本文带给您有价值的信息。

如果对您有帮助,请「点赞」支持,并「关注」我的主页获取更多后续相关文章。同时,也欢迎「收藏」本文,方便以后查阅。

写作不易,我会继续努力,提供有意义的内容。感谢您的支持和关注!