если метод объединяет два отсортированных списка, а подпись выглядит следующим образом, кто-то может передать связанный список, и если вы используете a.get (index), общая сложность времени выполнения будет O (N ^ 2).Похоже, что итераторы - единственный способ получить O (N) время выполнения.Но это делает код немного неуклюжим.Есть ли способ упростить этот код при сохранении времени выполнения O (N)?Спасибо за вашу помощь!
public static List<Integer> mergeListEfficient(List<Integer> a, List<Integer> b) {
List<Integer> result = new ArrayList<>();
Iterator<Integer> firstItr = a.iterator();
Iterator<Integer> secondItr = b.iterator();
Integer firstVal = firstItr.hasNext() ? firstItr.next() : null;
Integer secondVal = secondItr.hasNext() ? secondItr.next() : null;
while (firstVal != null || secondVal != null) {
if (firstVal != null && secondVal != null) {
if (firstVal < secondVal) {
result.add(firstVal);
firstVal = firstItr.hasNext() ? firstItr.next() : null;
} else {
result.add(secondVal);
secondVal = secondItr.hasNext() ? secondItr.next() : null;
}
} else if (firstVal != null) {
result.add(firstVal);
firstVal = firstItr.hasNext() ? firstItr.next() : null;
} else {
result.add(secondVal);
secondVal = secondItr.hasNext() ? secondItr.next() : null;
}
}
return result;
}
public static void main(String args[]) throws InterruptedException {
List<Integer> a = new java.util.LinkedList<>();
a.add(2);
a.add(3);
a.add(5);
List<Integer> b = new java.util.LinkedList<>();
b.add(3);
b.add(5);
b.add(6);
System.out.println(mergeListEfficient(a, b));
//prints correctly [2, 3, 3, 5, 5, 6]
}