Учитывая ваши критерии, вы должны использовать LinkedList.
LinkedList реализует интерфейс Deque, что означает, что он может добавлять в начало или конец списка за постоянное время (1). Кроме того, ArrayList и LinkedList будут выполнять итерацию за (N) время.
Вы НЕ должны использовать ArrayList просто потому, что стоимость добавления элемента при заполнении списка. В этом случае добавление элемента будет (N) из-за создания нового массива и копирования всех элементов из одного массива в другой.
Кроме того, ArrayList будет занимать больше памяти, поскольку размер вашего резервного массива может быть не полностью заполнен.