You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#实现无重复合并两个有序数组的算法(不使用LINQ)

合并有序整数数组并去重(无LINQ/数组特定方法实现)

你现在的问题其实可以分成两个部分解决:一是去掉合并后数组里的重复项,二是避免出现多余的默认值0。刚好因为两个输入数组都是有序的,咱们可以在合并的过程中就顺手处理这两个问题,效率还更高,不用额外多跑一遍遍历。

先给你改好的代码,后面再给你拆解关键改动:

public static int[] MergeArrays(int[] firstArray, int[] secondArray) {
    var firstLen = firstArray.Length;
    var secondLen = secondArray.Length;
    // 先临时用最大长度的数组过渡,最后会截断成有效长度
    var tempMerged = new int[firstLen + secondLen];
    var i = 0;
    var j = 0;
    var k = 0;

    while (i < firstLen && j < secondLen) {
        if (firstArray[i] < secondArray[j]) {
            // 检查当前元素和已加入的最后一个元素是否重复,不重复才添加
            if (k == 0 || tempMerged[k-1] != firstArray[i]) {
                tempMerged[k++] = firstArray[i];
            }
            i++;
        } else if (firstArray[i] > secondArray[j]) {
            if (k == 0 || tempMerged[k-1] != secondArray[j]) {
                tempMerged[k++] = secondArray[j];
            }
            j++;
        } else {
            // 两个元素相等,只存一次,同时移动两个指针
            if (k == 0 || tempMerged[k-1] != firstArray[i]) {
                tempMerged[k++] = firstArray[i];
            }
            i++;
            j++;
        }
    }

    // 处理第一个数组剩下的元素,同样做去重检查
    while (i < firstLen) {
        if (k == 0 || tempMerged[k-1] != firstArray[i]) {
            tempMerged[k++] = firstArray[i];
        }
        i++;
    }

    // 处理第二个数组剩下的元素
    while (j < secondLen) {
        if (k == 0 || tempMerged[k-1] != secondArray[j]) {
            tempMerged[k++] = secondArray[j];
        }
        j++;
    }

    // 最后根据有效元素的数量k,创建真正的结果数组
    var result = new int[k];
    for (int m = 0; m < k; m++) {
        result[m] = tempMerged[m];
    }
    return result;
}

关键改动说明:

  1. 合并时同步去重:
    因为输入数组是有序的,重复元素要么是同一数组内连续的,要么是两个数组之间相同的元素。每次添加新元素前,我们只需要和临时数组里最后一个已添加的有效元素对比——如果不一样,才把它加进去,这样就从根源上避免了重复。

  2. 解决默认值0的问题:
    用变量k记录临时数组里实际有效的元素数量,最后我们根据k创建一个刚好合适长度的新数组,把临时数组里的有效元素拷贝进去再返回。这样返回的数组就不会有多余的空位,自然也不会出现默认值0了。

  3. 处理两数组元素相等的情况:
    当两个数组当前指针指向的元素相等时,我们只添加一次,同时把两个指针都往后移,避免两边的相同元素都被加进去造成重复。

如果之后你想调整,也可以先按你原来的方法合并,再单独做去重和截断,但那样需要多遍历一遍数组,效率不如现在这种边合并边处理的方式高。

内容的提问来源于stack exchange,提问作者Mihaimyh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 17:02:37