合并两个arraylists而不创建第三个arraylists

时间:2016-01-21 21:54:20

标签: arrays list merge

这是一项任务,我试图解决。您必须编写函数

void merge(ArrayList a, ArrayList b)  {
// code
}

该函数接收两个大小相等的ArrayLists作为输入参数[a1,a2,...,an],[b1,b2,...,bn]。 执行结果是第一个ArrayList必须包含两个列表的元素,并且它们一致地交替([a1,b1,a2,b2,...,an,bn])请读两次粗体文本=)

代码必须尽可能高效地工作。

这是我的解决方案

public static void merge(ArrayList a, ArrayList b) {
ArrayList result = new ArrayList();
int i = 0;

Iterator iter1 = a.iterator();
Iterator iter2 = b.iterator();
while ((iter1.hasNext() || iter2.hasNext()) && i < (a.size() + b.size())) {
    if (i % 2 ==0) {
        result.add(iter1.next());
    } else {
        result.add(iter2.next());
    }
    i++;
}

a = result;

}

我知道它根本不完美。但我无法理解如何在不创建tmp列表的情况下合并到第一个列表中。

提前感谢您的参与。

2 个答案:

答案 0 :(得分:0)

Double ArrayList a的大小。将a的最后两个元素设置为旧a的最后一个元素和b的最后一个元素。继续,每次备份,直到到达ab的开头。您必须从后面进行操作,否则您将覆盖原始a的值。

答案 1 :(得分:0)

最后我得到了这个:

public static void merge(ArrayList<Integer> arr1, ArrayList<Integer> arr2) {
        int indexForArr1 = arr1.size() - 1;
        int oldSize = arr1.size();
        int newSize = arr1.size() + arr2.size();

        /*
            decided not to create new arraylist with new size but just to fill up old one with nulls
         */
        fillWithNulls(arr1, newSize);

        for(int i = (newSize-1); i >= 0; i--) {
            if (i%2 != 0) {
                int indexForArr2 = i%oldSize;
                arr1.set(i,arr2.get(indexForArr2));
                oldSize--; // we reduce the size because we don't need tha last element any more
            } else {
                arr1.set(i, arr1.get(indexForArr1));
                indexForArr1--;
            }
        }
    }

    private static void fillWithNulls(ArrayList<Integer> array, int newSize) {
        int delta = newSize - array.size();
        for(int i = 0; i < delta; i++) {
            array.add(null);
        }
    }

再次感谢John的好主意!