Не очень понял. Вы заменили изначальную структуру (список диапазонов) или этот список точек генерится по запросу?
Я сделал так, что изначального плохого списка вообще нет. Список сразу хороший по построению.
Билдер билдер = НовыйБилдер();
// получаем данные из БД и засовываем их в билдер:
билдер.Добавить(123, 456);
билдер.Добавить(987, 10000);
// А теперь билдим сразу правильный список:
Список список = билдер.Собрать();
Внутри билдера упорядоченный двухсвязный список точек. Уж больно легко их мёржить. Надо найти начальную head и конечную tail точку, затем все что между ними сколлапсировать вот так:
head.next = tail;
tail.prev = head;
Уже забилженный "Список" - неизменный, там внутри массив. По массиву можно делать бинарный поиск.