Складываете все численные значения from и to в один массив, при этом в этом массиве должны лежать пары (граница, тип), где тип — это значение типа boolean (например, true — это левая граница (from), а false — правая (to)).
Затем запускаете алгоритм быстрой сортировки на массиве.
Затем, FOR-ом проходите по отсортированному массиву и формируете окончательный список. Список формируется примерно так: проверяем тип границы, добавляем границу в список, идём дальше. Если несколько раз подряд встречается граница одного типа, то имеет место пересечение. В этом случае для левой границы нужно запоминать только первый встретившийся элемент, а для правой — последний.
Вот как-то так. Если не понятно объяснил, спрашивайте.
Алгоритм работает примерно за O(N log(N) + N) = O(N log(N)), т.е. довольно быстро.