题目中说明是两个有序数组,就一个一个比较,第一个数组的第一个元素和第二个数组的第一个元素比较。小的插入到result数组中。若有重复的元素,则去其中一个。这个时候,相当于从两个数组中都取了一个元素,所以两个数组的下标都要后移,result的下标自然也要后移。
package com.algorithm;
/*
* 合并两个有序数组,合并之后还是有序的 并且去除重复的。
* */
public class MergeAndSortArray {
public static void main(String[] args) {
int [] num1=new int[]{1,3,5,6,7};
int [] num2=new int[]{3,5,6,8};
merge(num1, num2);
}
private static void merge(int [] num1,int [] num2){
int[] result=new int[num1.length+num2.length];
int i=0,j=0,k=0;//定义三个变量。i j k分别控制num1 num2 result三个数组的下标
while(i<num1.length && j< num2.length){//两个数组都不为空的时候
if(num1[i]<num2[j]){//若num1的元素小,加入result
result[k]=num1[i];
i++;//num1的下标后移
k++;//result的下标后移
}else if(num1[i]==num2[j]){//若二者相等 这一步就是去重复。
result[k]=num1[i];//这里两个数组的元素把哪个加入result都行
k++;//result下标后移
i++;//这里要注意的是 两个重复了,去重之后,两个数组的下标都要后移
j++;
}else {
result[k]=num2[j];//若num2的元素小,加入result
k++;
j++;
}
}
//若不要求去重。while循环应换成如下代码:
// while(i<num1.length && j< num2.length){
// if(num1[i]<=num2[j]){
// result[k++]=num1[i++];
// }else{
// result[k++]=num2[j++];
// }
// }
//下面是当其中一个数组元素全部添加到result了,另一个还没添加完 继续添加。
while(i<num1.length){//
result[k]=num1[i];
i++;
k++;
}
while(j<num2.length){
result[k]=num2[j];
j++;
k++;
}
for (int num : result) {
System.out.println(num);
}
}
}
也可以上来就考虑,一个数组的最小元素是不是大于另一个数组的最大元素,即先把一个数组的最后一个元素和另一个元素的第一个元素相比较。如果是这样子,那直接把两个数组依次加入result。这样就省去了一个比较大小那个while循环吧。最好情况。