Puedes usar mergeSort.
 
Te dejo una implementación que se me ha ocurrido:    
Código Java:
Ver originalLinkedList<String> cadenas = new LinkedList<String>();
        Collections.
addAll(cadenas, 
"Hola", 
"Esteban", 
"Mañana", 
"Deseo", 
"Adios", 
"Alvaro", 
"Abierto");  
        LinkedList<String> ordenadas = MergeSort(cadenas, new Comparator<String>() {
 
            @Override
                return o1.compareTo(o2);
            }
        });
  
     
Código Java:
Ver originalpublic static <T> LinkedList<T> MergeSort(LinkedList<T> lista, Comparator<T> comparador) {
 
 
        if (lista.size() > 1) {
            LinkedList<T> lista1, lista2;
 
            int corte = lista.size() / 2;
            lista1 = new LinkedList<T>(lista.subList(0, corte));
            lista2 = new LinkedList<T>(lista.subList(corte, lista.size()));
 
            lista1 = MergeSort(lista1, comparador);
            lista2 = MergeSort(lista2, comparador);
            return Merge(lista1, lista2, comparador);
        } else {
            return lista;
        }
 
 
    }
 
    private static <T> LinkedList<T> Merge(LinkedList<T> lista1, LinkedList<T> lista2, Comparator<T> comparador) {
        LinkedList<T> listaSalida = new LinkedList<T>();
 
 
        while (lista1.size() > 0 || lista2.size() > 0) {
 
 
            if (lista2.size() == 0 || lista1.size() > 0 && comparador.compare(lista1.getFirst(), lista2.getFirst()) <= 0) {
                listaSalida.add(lista1.pollFirst());
            } else if (lista1.size() == 0 || lista2.size() > 0 && comparador.compare(lista1.getFirst(), lista2.getFirst()) > 0) {
                listaSalida.add(lista2.pollFirst());
            }
        }
        return listaSalida;
 
    }
  
En esta implementación uso Strings, pero puedes cambiarlo por el tipo que quieras usando un comparador personalizado (como el que te he puesto en el post anterior). 
Saludos.