Вы можете использовать LinkedList.removeAll
на L1
, используя HashSet
для L2
, если это еще не HashSet
:
L1.removeAll(L2 instanceof HashSet ? L2 : new HashSet<>(L2));
На более высоком уровне это повторяет L1
перечисляет и удаляет каждый элемент на месте, если он принадлежит другой коллекции L2
.
Внутренне LinkedList.removeAll
использует свой Iterator
для обхода своих элементов, а затем использует метод contains
другой коллекции, чтобы проверить, должен ли элемент быть удален.Если contains
возвращает true
, он удаляет элемент с помощью метода Iterator.remove
.
Теперь использование Iterator.remove
для LinkedList
является O(1)
худшим случаем, поскольку удаляемый элементэто элемент, на который в данный момент указывает итератор.И использование contains
над HashSet
является средним O(1)
, поэтому все решение будет либо O(n)
, если L2
уже равно HashSet
, либо O(n+m)
, если нет.(Здесь n=L1.size()
и m=L2.size()
).