这是一项任务,我试图解决。您必须编写函数
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列表的情况下合并到第一个列表中。
提前感谢您的参与。
答案 0 :(得分:0)
Double ArrayList a
的大小。将a
的最后两个元素设置为旧a
的最后一个元素和b
的最后一个元素。继续,每次备份,直到到达a
和b
的开头。您必须从后面进行操作,否则您将覆盖原始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的好主意!