Cómo escribir un código para fusionar dos listas vinculadas ordenadas

El código recursivo en Java para fusionar dos LinkedList ordenados es

Node MergeLists (Lista de nodos1, Lista de nodos2)
{
Resultado del nodo = nulo;
if (lista1 == nulo)
return list2;
if (lista2 == nulo)
lista de retorno1;

if (list1.data <= list2.data)
{
resultado = lista1;
result.next = MergeLists (list1.next, list2);
}
más
{
resultado = lista2;
result.next = MergeLists (list1, list2.next);
}
resultado de retorno;
}

Aquí el caso base es, si list1 es nulo entonces devolvemos list2 o si list2 es nulo devolvemos list1.

Consideremos un ejemplo

lista1: 1-> 2-> 5-> 6-NULL

list2: 3-> 4-> 7-> NULL

1-> 2-> 5-> 6-NULL y 3-> 4-> 7-> NULL

En este caso, al comparar 1 y 3, 1 es más pequeño, por lo que resultado = Nodo 1.

Esta será la cabeza de la lista resultante después de la fusión.

Ahora nos quedan las siguientes listas vinculadas para fusionar.

2-> 5-> 6-> NULL y 3-> 4-> 7-> NULL

Nuevamente se comparan 2 y 3 y el resultado será 2. Ahora las listas vinculadas a fusionar son

5-> 6-> NULL y 3-> 4-> 7> NULL

En este punto, se comparan 3 y 5 y se almacena 3 como resultado.
Las listas vinculadas restantes son

5-> 6-> NULL y 4-> 7-> NULL

Este proceso continuará hasta que se encuentre nulo y la recursión comience a desenrollarse y en cada función se devolverá el resultado almacenado.

Código en C

Nodo * Listas de combinación (Nodo * lista1, Nodo * lista2)
{
Nodo * resultado = NULL;
if (lista1 == nulo)
return list2;
if (lista2 == nulo)
lista de retorno1;

if (lista1-> datos datos)
{
resultado = lista1;
resultado-> siguiente = MergeLists (lista1-> siguiente, lista2);
}
más
{
resultado = lista2;
resultado-> siguiente = MergeLists (lista1, lista2-> siguiente);
}
resultado de retorno;
}

Es bastante sencillo …

/ *
Insertar nodo al final de una lista vinculada
la entrada del puntero principal también puede ser NULL para la lista vacía
El nodo se define como
Nodo de clase {
datos int;
Nodo siguiente;
}
* /
Node MergeLists (Nodo headA, Node headB) {
if (headA == null) {
cabeza de retorno B;
}
if (headB == null) {
cabeza de retorno A;
}
if (headA.data headA.next = MergeLists (headA.next, headB);
cabeza de retorno A;
}
más {
headB.next = MergeLists (headA, headB.next);
cabeza de retorno B;
}
}

Si bien se alienta el aprendizaje de la recursividad, no implica que siempre debamos escribir uno. Este es un problema estándar y lo encuentro más limpio y más legible cuando se implementa de manera no recursiva. Vea la implementación a continuación:

Nodo * MergeSortedLinkedLists (Nodo * pPrimero, Nodo * pSegundo)
{
Nodo tempNodo;
Nodo * pCrawler = & tempNode;

while (pFirst && pSecond)
{
if (pPrimero-> datos datos)
{
pCrawler-> pNext = pFirst;
pFirst = pFirst-> pNext;
}
más
{
pCrawler-> pNext = pSecond;
pSecond = pSecond-> pNext;
}
pCrawler = pCrawler-> pNext;
}

si (pFirst)
pCrawler-> pNext = pFirst;
si (pSegundo)
pCrawler-> pNext = pSecond;

return tempNode.pNext;
}

Código completo en ideone

Según su consulta sobre cómo visualizar el enfoque recursivo, todo se trata de práctica. Intenta dibujar el árbol de recursión en papel y analiza cómo funciona. La recursión es un tema muy importante y sin esto, nunca podrás dominar el backtracking y el DP.

More Interesting

¿Cuál es un buen enfoque de aprendizaje automático para recomendar noticias basadas en el historial de lectura de un usuario?

¿Cuál sería un ejemplo de un problema de programación que sería difícil si no fuera posible sin el uso de array?

¿Es posible usar los poderes de una matriz de adyacencia para calcular las rutas más cortas que BFS calcularía?

¿Cómo funciona el algoritmo de acortador de URL?

Cómo comenzar con la introducción a los algoritmos (CLRS)

¿Alguien puede proporcionarme un algoritmo de muestra en CS para ISC 2017?

Cómo ordenar la lista de números dada en orden de registro (n)

¿Dónde puedo obtener el algoritmo de 'Biblioteca de Babel'?

¿Qué algoritmo es el más adecuado para la detección de fraudes en términos de precisión y consistencia en la minería de datos?

¿Qué son los proyectos de código abierto? Soy muy bueno en C ++, estructuras de datos y algoritmos. ¿Puedo contribuir a algunos proyectos de código abierto? Si es así, ¿cómo? ¿Tendré que aprender algún idioma nuevo?

¿Cómo uso cualquier biblioteca en Java que implemente la selección de funciones del algoritmo RELEIFF?

¿Qué son los algoritmos de calibración para aplicaciones biomédicas en teléfonos inteligentes?

¿Cuáles son las aplicaciones prácticas de los diversos algoritmos que estudian los estudiantes de CS en Data Structures?

Quiero construir una casa de piedra óptima, usando una computadora para decidir la disposición de las piedras. ¿Cómo podría funcionar esto?

¿Cuál es el algoritmo de cifrado más complejo?