Cómo agregar números de dos listas vinculadas

Dadas dos listas vinculadas, cada nodo de lista con un dígito entero, agregue estas dos listas vinculadas. El resultado debe almacenarse en la tercera lista vinculada. También tenga en cuenta que el nodo principal contiene el dígito más significativo del número.

Solución : dado que la suma de enteros comienza desde el dígito menos significativo, primero debemos visitar el último nodo de ambas listas y sumarlas, crear un nuevo nodo para almacenar el resultado, cuidar el acarreo si lo hay y vincular el resultado nodo a nodo que se agregará al segundo nodo menos significativo y continuará.

En primer lugar, debemos tener en cuenta la diferencia en el número de dígitos en dos números. Entonces, antes de comenzar la recursión, necesitamos hacer algunos cálculos y mover el puntero de la lista más larga al lugar apropiado para que necesitemos el último nodo de ambas listas al mismo tiempo. Otra cosa es que tenemos que cuidar es llevar. Si dos dígitos suman más de 10, debemos reenviar el acarreo al siguiente nodo y agregarlo a ellos. Si la suma de dígitos más significativa resulta en carry, necesitamos crear un nodo adicional para almacenar carry.

La función a continuación es en realidad una función de envoltura que hace todo el mantenimiento como calcular longitudes de listas, llamar a la implementación recursiva, crear un nodo adicional para llevar en el dígito más significativo y agregar los nodos restantes que quedan en la lista más larga.

void addListNumbersWrapper (struct ListNode * list1, struct ListNode * list2, int * carry, struct ListNode ** result) {
int list1Length = 0, list2Length = 0, diff = 0;
struct ListNode * current = list1;
while (actual) {
actual = actual → siguiente;
list1Length ++;
}
actual = lista2;
while (actual) {
actual = actual → siguiente;
list2Length ++;
}
if (list1Length <list2Length) {
actual = lista1;
lista1 = lista2;
lista2 = actual;
}
diff = abs (list1Length-list2Length);
actual = lista1;

mientras (diff–)
actual = actual → siguiente;

addListNumbers (current, list2, carry, result);
diff = abs (list1Length-list2Length);
addRemainingNumbers (list1, carry, result, diff);

if (* carry) {
struct ListNode * temp = (struct ListNode *) malloc (sizeof (struct ListNode));
temp → next = (* resultado);
* resultado = temp;

}
regreso;
}
void addListNumbers (struct ListNode * list1, struct ListNode * list2, int * carry, struct ListNode ** result) {
int sum;
if (! list1)
regreso;

addListNumbers (list1 → next, list2 → next, carry, result);

// Fin de ambas listas, agréguelas
struct ListNode * temp = (struct ListNode *) malloc (sizeof (struct ListNode));
sum = list1 → data + list2 → data + (* carry);

// Tienda llevar
* carry = suma / 10;
suma = suma% 10;

temp → datos = suma;
temp → next = (* resultado);
* resultado = temp;

regreso;
}
void addRemainingNumbers (struct ListNode * list1, int * carry, struct ListNode ** result, int diff) {
int suma = 0;
if (! list1 || diff == 0)
regreso;

addRemainingNumbers (list1 → next, carry, result, diff-1);

struct ListNode * temp = (struct ListNode *) malloc (sizeof (struct ListNode));
sum = list1-> data + (* carry);
* carry = suma / 10;
suma = suma% 10;

temp → datos = suma;
temp → next = (* resultado);
* resultado = temp;

regreso;
}

Complejidad del tiempo: O ().
Complejidad espacial: O () para pila recursiva.

Nota: También se puede resolver con pilas.

Problema:

Números representados como las siguientes listas vinculadas:

Número 98976, lista vinculada: 9-> 8-> 9-> 7-> 6-> nulo

Número 198, lista vinculada: 1-> 9-> 8-> nulo

La salida:

lista vinculada: 9-> 9-> 1-> 7-> 4-> nulo

Aquí está la solución usando pilas:

Suma de dos listas enlazadas usando pilas

Aquí hay soluciones recursivas:

Suma de dos listas enlazadas utilizando recursividad | Serie 1

Suma de dos listas enlazadas utilizando recursividad | Set 2

He resuelto el problema sin usar pilas o recursividad.

La solución se puede encontrar en mi repositorio de GitHub.

Divyansh00 / Data-Structures-and-Algorithms

He incluido comentarios y la lógica que he usado para resolver el problema.

Por favor comparta sus pensamientos y comentarios al respecto.

Puede seguir el siguiente enlace para obtener más detalles:

Escriba un programa en Java para agregar entre dos listas enlazadas