两个有序数组的合并排序(归并思想),Java代码实现,并去重复,考虑空间利用率问题

版权声明:转载请标明附带连接标明出处 https://blog.csdn.net/Hollake/article/details/90902367

搜了好多文章,发现代码是错的,没有达到去重的目的,而且还有人点赞,你们看代码难道不自己测一下看对不对吗?下面是我写的代码,代码看起来长,可能确实有点冗余,但是容易理解,如果有错或者可以优化,麻烦你指出来,可以共同学习,谢谢。

题目要求:数组A,B有序,要求合并A,B,并且去除重复元素。

下面代码实现的复杂度,设A和B的数组长度为M和N那么时间复杂度为O(M+N),如果中用数组实现,空间复杂度也为O(M+N)

public class Solution {
    public static void main(String[] args) {
        int[] A = {1,2,3,4,5};
        int[] B = {1,2,2,3,4,5,5,6,7,7};
        int[] result = Solution.multiply(A, B);
        System.out.println(Arrays.toString(result));
    }
    public static int[] multiply(int[] A,int[] B) {
        if (A == null && B == null || A.length < 1 && B.length < 1) {
            return null;
        }
//        创建辅助集合,其实数组创建新的数组也行,new int[A.length+B.length]
        List<Integer> list = new ArrayList<>();
        int index = 0, p1 = 0, p2 = 0;
//        先将A或者B中的首个元素添加到list中
        list.add(A[p1++]);
//        当没有遍历完A和B中任意一个数组时执行
        while ( p1 < A.length && p2 < B.length ) {
//          拿到当前指针的最小值  
            int tmp = A[p1] < B[p2] ? A[p1++] : B[p2++];
//            判断list中是否已经添加了此元素
            if (tmp > list.get(index)) {
                list.add(tmp);
//                每次添加元素后指针后移
                index++;
            }
        }
//        当B中元素添加完,只剩A中元素时
        while ( p1 < A.length ) {
            int tmp = A[p1++];
            if (tmp > list.get(index)) {
                list.add(tmp);
                index++;
            }
        }
//        当A中元素添加完,只剩B中元素时
        while ( p2 < B.length ) {
            int tmp = B[p2++];
            if (tmp > list.get(index)) {
                list.add(tmp);
                index++;
            }
        }
//        将list中元素重新移回到数组,如果刚开始创建的是数组,那么就不用这一步了
        int[] result = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            result[i] = list.get(i);
        }
        return result;

    }
}

猜你喜欢

转载自blog.csdn.net/Hollake/article/details/90902367