Cómo resolver la siguiente pregunta en Java: tengo dos listas vinculadas, que representan dos números: l1: 2-> 3-> 4, l2: 7-> 8; agregue estos dos números y almacene el resultado en l1, es decir, l1 debería convertirse en l1: 3-> 1-> 2

Comprendí por los detalles de la pregunta que la recursividad es una posibilidad. Así que aquí hay un algoritmo O (N) con O (1) espacio adicional además de guardar el resultado.

Primero encuentre la longitud de cada lista. Luego use la recursividad para sumar las 2 listas de dígitos.
Si las listas tienen longitudes diferentes, hay 2 casos:
– size (l1)> size (l2): supongamos que l2 tiene ceros a la izquierda.
– size (l1) <size (l2): agregar nodos encabeza l1 hasta que tengan el mismo tamaño porque l1 almacenará el resultado.

class Ideone {
static class Node {
int digit;
Node next;
Node(int value) {
digit = value;
next = null;
}
}
public int listLength(Node current) {
return current == null ? 0 : 1 + listLength(current.next);
}
// The return node may have a value > 9.
public Node sumLists(Node a, int remainingA, Node b, int remainingB) {
if (a == null && b == null)
return null;
if (remainingA == remainingB) {
a.next = sumLists(a.next, remainingA-1, b.next, remainingB-1);
} else if (remainingA > remainingB) {
a.next = sumLists(a.next, remainingA-1, b, remainingB);
} else {
Node cur = a; // Add a node to the head of list A.
a = new Node(0);
a.next = sumLists(cur, remainingA, b.next, remainingB-1);
}
if (a.next != null && a.next.digit > 9) {
a.next.digit %= 10;
a.digit++; // Carry.
}
if (remainingA <= remainingB) { // Does list b have a digit?
a.digit += b.digit;
}
return a;
}
// Sums 2 lists. Saves result in the first one.
public Node sumLists(Node a, Node b) {
int lengthA = listLength(a);
int lengthB = listLength(b);
a = sumLists(a, lengthA, b, lengthB);
if (a != null && a.digit > 9) {
Node cur = a;
cur.digit %= 10;
a = new Node(1);
a.next = cur;
}
return a;
}
}

Aquí hay soluciones recursivas para este problema:

Suma de dos listas enlazadas usando recursividad | Serie 1

Suma de dos listas enlazadas usando recursividad | Set 2

y aquí está la solución usando pilas:

Suma de dos listas enlazadas usando pilas

Algoritmo usando pilas:

1. Cree la pila ‘s1’ empujando todos los valores de nodo de la primera lista vinculada a una pila.

2. Cree la pila ‘s2’ empujando todos los valores de nodo de la segunda lista vinculada a una pila.

3. Cree una pila vacía ‘s3’ para almacenar el resultado de la suma.

4. Inicializar suma y llevar a 0.

5. Pop el elemento superior de la pila ‘s1’. Deje que este elemento superior sea ‘valor1’.

6. Pop el elemento superior de la pila ‘s2’. Deje que este elemento superior sea ‘value2’.

7. Make ‘sum’ = (value1 + value2 + carry)% 10 y empuje esta ‘sum’ para apilar ‘s3’ y make ‘carry’ = (value1 + value2 + carry) / 10.

8. Repita los pasos 5-7 hasta que una de las pilas quede vacía. Si ambas pilas son del mismo tamaño, ambas pilas quedarían vacías al mismo tiempo.

9. Si a la pila ‘s1’ le quedan elementos, entonces:

a. Pop el elemento superior de la pila ‘s1’. Deje que este elemento superior sea ‘valor1’.

si. Haga ‘sum’ = (valor1 + carry)% 10 y presione esta ‘suma’ para apilar ‘s3’ y haga ‘carry’ = (value1 + carry) / 10.

C. Repita los pasos 9a y 9b hasta que la pila ‘s1’ no esté vacía.

10. Del mismo modo, si la pila ‘s2’ tiene elementos restantes, entonces:

a. Pop el elemento superior de la pila ‘s2’. Deje que este elemento superior sea ‘value2’.

si. Haga ‘sum’ = (valor2 + carry)% 10 y presione esta ‘suma’ para apilar ‘s3’ y haga ‘carry’ = (value2 + carry) / 10.

C. Repita los pasos 10a y 10b hasta que la pila ‘s2’ no esté vacía.

11. Después de ejecutar todos los pasos anteriores, si el acarreo es mayor que 0, empújelo a la pila resultante ‘s3’.

12. Cree una lista enlazada vacía ‘resultado’. Ahora haga estallar los elementos uno por uno de la pila ‘s3’, y siga agregándolos a la lista vinculada ‘resultado’ hasta que la pila ‘s3’ no esté vacía. Devuelve la salida como lista vinculada ‘resultado’.

Espero que esto ayude.

¿Por qué necesitarías revertir las listas?

Esta solución no invierte las listas … pero tampoco utiliza la recursividad.

Primer bucle:
Iterar l1 y l2. Cuenta elementos en cada uno.

Agregue N ceros a la más corta de las dos listas en el frente. N es la diferencia absoluta de los recuentos de l1 y l2. Suponiendo aquí que el frente de la lista es el 2 y 7 respectivamente. Así terminarías con:

l1: 2-> 3-> 4
l2: 0-> 7-> 8

Establezca una variable de indicador de acarreo en 0.

Segundo bucle:
Para cada elemento en el recuento más grande de l1 o l2, haga lo siguiente:
Iterar para contar menos la posición del iterador en ambas listas.
Agregue los dos números y el indicador de acarreo. Mantenga un registro del transporte desde esta adición en el indicador de transporte.
Almacene el resultado de la adición en este cubo de la lista.

Hecho. l1 contiene 3-> 1-> 2.

Por cierto, también corrigí tu pregunta. Originalmente se dijo que la solución es l1: 2-> 1-> 2 que es incorrecta.

More Interesting

Cómo completar esta tarea de programación

¿Conocer solo C es una desventaja en las entrevistas técnicas?

Cómo mejorar en las preguntas de la entrevista 'blanda'

¿Cuáles son algunos ejemplos importantes de 'encontrar la salida', preguntas de depuración y conceptos que uno debe saber para una entrevista de ingeniería de software?

¿Cuáles son las preguntas más frecuentes en ASP.NET en una entrevista y cuáles se pueden preguntar si uno ha creado un sitio web universitario como parte de un proyecto?

Escriba un programa para contar el número de subárboles de valor único en un árbol dado.

Los entrevistadores me dicen que mis habilidades de programación en C ++ son buenas, pero no lo suficientemente buenas. ¿Qué métricas / herramientas usan los entrevistadores al evaluar el desempeño?

Una matriz int arr [10] = {}, la dirección de arr es 100, en una máquina de 32 bits, entonces & arr + 4 =? 116 o 260 u otros?

¿Cuáles son las preguntas que se hacen durante las entrevistas técnicas para los graduados de CSE?

¿Alguien puede proporcionarme tutoría en línea para descifrar entrevistas tecnológicas?

No me entrevistaron en absoluto en el programa Google STEP. ¿Hay algo mal conmigo?

¿Cuáles son algunos proyectos que se pueden hacer para mejorar mi cartera de proyectos junto con mi currículum?

Cómo dejar de sentirse mediocre en algoritmos y estructura de datos en entrevistas técnicas

¿Qué empresas o startups debo solicitar para una pasantía?

C ++ (lenguaje de programación): ¿Cómo puedo usar BST para encontrar el elemento mayoritario en una matriz sin clasificar?