Предполагая, что добавляемый исходный список уничтожается, как это, кажется, имеет место в вашем коде, вы можете добавить два списка в O(1)
, используя следующий алгоритм:
lAend ----------------------------+
V
listA -> item A1 -> item A2 -> item A3 -> null
listB -> item B1 -> item B2 -> item B3 -> null
^
lBend ----------------------------+
Вам нужноуказатели списка, а также указатели начала списка, но код для добавления listB
в конец listA
просто:
lAend->next = listB; lAend = lBend;
listB = null; lBend = null;
После этого listB
пусто и listA
содержит объединенный список:
lAend ---------------------------------------+
listA -> item A1 -> item A2 -> item A3 --+ |
| |
+------------------------+ |
| V
+--> item B1 -> item B2 -> item B3 -> null
listB -> null
lBend -> null
Если вы не сохраните указатель конца, O(1)
невозможно, так как вам нужно найти последний элемент первогосписок, принципиально O(n)
операция.