Java 将2个排序列表与所有元素合并

Java 将2个排序列表与所有元素合并,java,merge,Java,Merge,我有一个家庭作业,我花了好几个小时试图解决它 描述:我们有2个排序数组列表,列表a的长度是n,列表b的长度是m;我们假设a和b已经排序,并且列表a和b不包含重复项 public static List<Integer> union(List<Integer> list1, List<Integer> list2 ) { List<Integer> union = new ArrayList<>(); int n1 = 0

我有一个家庭作业,我花了好几个小时试图解决它

描述:我们有2个排序数组列表,列表a的长度是n,列表b的长度是m;我们假设a和b已经排序,并且列表a和b不包含重复项

public static List<Integer> union(List<Integer> list1, List<Integer> list2 ) {
    List<Integer> union = new ArrayList<>();
    int n1 = 0;
    int n2 = 0;
   

    for (int i = 0; i < list1+list2; i++) {
       ....
}
公共静态列表联合(列表1、列表2){
List union=new ArrayList();
int n1=0;
int n2=0;
对于(int i=0;i
如果循环到
m+n
其中一个数组的大小可能小于另一个数组,则该数组将耗尽,因此数组索引将超出范围。相反,您可以使用
循环,该循环将仅循环到两个列表的最小大小,并且由于列表已排序,因此可以添加所有剩余的元素从两个列表中较大的一个进入
联合

// iterate till the minimum of two lists

while(index1 < a.size() && index2 < b.size()) {
  if (a.get( index1 ) > b.get( index2 )) {
    union.add(i++, b.get( index2++ ));
  }
  else {
    union.add(i++, a.get( index1++ ));
  }
}

//add the elements of the bigger list to the union

while(index1 < a.size()) {
  union.add(i++ ,a.get( index1++ ));
}

while(index2 < b.size()){
  union.add(i++, b.get( index2++ ));
}
//迭代到最少两个列表
而(index1b.get(index2)){
union.add(i++,b.get(index2++));
}
否则{
union.add(i++,a.get(index1++));
}
}
//将较大列表中的元素添加到联合体中
而(index1
公共静态列表联合(列表一、列表二){
List res=newarraylist(one.size()+two.size());
对于(inti=0,a1=0,a2=0;ires.add(one.get(a1)[提示:]当列表中的一个被消耗时会发生什么情况?问题在于当您到达一个数组的末尾,并且在增加比较索引后仍试图获取一个值。此时您将超出数组边界。您需要确保不会超出,并继续从耗尽的数组中提取。
public static List<Integer> union(List<Integer> one, List<Integer> two) {
    List<Integer> res = new ArrayList<>(one.size() + two.size());

    for (int i = 0, a1 = 0, a2 = 0; i < one.size() + two.size(); i++) {
        if (a1 == one.size())
            res.add(two.get(a2++));
        else if (a2 == two.size())
            res.add(one.get(a1++));
        else
            res.add(one.get(a1) <= two.get(a2) ? one.get(a1++) : two.get(a2++));
    }

    return res;
}