(i) вам нужно добавить O (1) элементов в A, означает, что вы добавляете постоянный элемент, то есть один элемент. Таким образом, вы можете добавить это, сначала создав связанный список из списка элементов, который будет O (n). Дальнейшее добавление узла путем перебора связанного списка в любой позиции будет O (n). Следовательно, общая сложность времени будет O (n).
Для справки: https://www.geeksforgeeks.org/given-a-linked-list-which-is-sorted-how-will-you-insert-in-sorted-way/
(ii) Сначала мы можем отсортировать O (log n) элементов мы хотим вставить, это можно сделать с помощью алгоритма, подобного сортировке слиянием или сортировке кучи, в O (log (n) log (log (n))). если log (n) = k, то это будет O (k log (k)). Затем мы можем выполнить слияние двух списков (или любого вида структуры данных, при условии, что мы можем перебирать ее в порядке возрастания). Это слияние может быть выполнено в O (k + n), так как мы можем одновременно выполнять итерацию по двум спискам и каждый раз «излучать» наименьший из двух и перемещать соответствующий курсор.
Таким образом, общее время сложность будет O (n).
Например, для двух отсортированных массивов мы можем объединить их с:
public static int[] merge_sorted(int[] a, int[] b) {
k = a.length;
n = b.length;
int[] c = new int[k+n];
int ai = 0;
int bi = 0;
int ci = 0;
while(ai < k && bi < n) {
if(a[ai] <= b[bi]) {
c[ci++] = a[ai++];
} else {
c[ci++] = b[bi++];
}
}
while(ai < k) {
c[ci++] = a[ai++];
}
while(bi < n) {
c[ci++] = b[bi++];
}
return c;
}