Если вы просто хотите иметь коллекции объектов и объединить их за O (1) время, и не возражаете против реализации своей собственной структуры данных, то самый простой способ сделать это - использовать несбалансированное двоичное дерево: каждый узел является либо листом (хранящим значение), либо комбинацией двух деревьев, и вы можете просто реализовать их как два класса с абстрактным суперклассом или интерфейсом. Для извлечения элементов можно использовать обход в глубину.
По сути, это то же самое, что и предложение ColinD о конкатенации итераторов, но более простое.
Суть в том, что итерация по этой коллекции не будет O ( n )! Это будет O ( n + m ), где m - количество выполненных вами слияний (поскольку каждое из них является узлом, который необходимо пройти). Это верно как для моего решения, так и для ColinD. Я не знаю, верно ли это для всех возможных решений этой проблемы.
Не обращайте внимания на вышесказанное. Согласно этой схеме каждое слияние добавляет хотя бы один элемент, поэтому m <<em> n , поэтому стоимость итерации по-прежнему составляет O ( n ). (Если вы используете конкатенацию итераторов, убедитесь, что вы не часто объединяете пустые итераторы, так как это увеличит стоимость.)