Add Two Numbers
# Problema
Este problema es bastante simple, pero tiene sus gotchas. El problema dice asi:
Dada dos listas enlazadas, las cuales, solo pueden guardar integers. Determina la suma de ellas, toma en cuenta que estas se encuentran de reversa, de modo que, una lista como [3, 4, 5] en realidad representa el numero 543.
# Notas
Este es un problema con su complejidad, desde que las listas se encuentran invertidas hasta los calculos para determinar cada caso especifico.
Antes de codificar la solucion, debemos entender el problema. Para ello, un ejemplo es lo mejor. La suma de las listas [2, 4, 3] + [5, 6, 4] da como resultado 807, numero el cual, debe ser representado al final igualmente como una lista enlazada, de modo que tendriamos la lista: [7, 0, 8].
Para resolver este problema, podemos tomar dos acercamientos, invertir las listas y hacer los calculos o utilizar un poco de matematica con modulos y divisiones para hacer los calculos.
Una cosa a tomar bastante en cuenta es utilizar sumas simples desde 0-9 haciendose cargo del caso especial en caso de que quede un remainder al hacer la suma de estos (Como de 12, hacerse cargo del 2 y del 1 en la suma para el siguiente nodo). De esta forma, se logran sumar valores que exceden el limite de los lenguajes (numeros de 32 y 64 bits).
Mi solucion va asi:
- Definimos una variable
firstpara representar el primer nodo de la lista que sera regresado al final para la respuesta, se inicializa con None - Se define una variable
rque representa el reminader para los casos cuando tengamos valores mayores o iguales a 10 - Se define una variable
resppara mantener el control del avance en la lista de respuesta - Se definen dos nodos, el
node1y elnode2, que representaran los nodos actuales al iterar sobre las listas - Se entra en un ciclo, del cual no se saldra hasta que ambos
node1ynode2sean None, para entonces, se habra iterado sobre las listas - Primero se checa si el
node1se encuentra en None. Si es asi, el valor de este para la suma es 0. Si no, se utiliza el valor y se actualiza el node a ser el siguiente. - Se hace el mismo chequeo con
node2 - Ahora hacemos la suma de dichos valores que acabamos de obtener de los nodos. Tomamos en consideracion los casos cuando el remainder
res mayor que 0, en tal caso, lo agregaremos a la suma y lo reiniciaremos. Caso contrario, hacemos una suma normal solo considerando los dos valores de los nodos - Siguiente consideramos el caso en el cual la suma ha sido mayor que 9 (Mayor o igual que 10). Para dicho caso, calculamos el remainder y el nuevo valor de la suma, quitandole 10.
- Ahora procedemos a construir la lista de respuesta, si resp es None, significa que estamos en la primer iteracion, por tanto, colocamos un nuevo nodo como
respe inicializamosfirstpara ser este mismo nodo, puesto que, siempre sera el primero. Caso contrario, simplemente actualizamos el siguiente nodo de la listarespy actualizamosresppara que apunte a dicho nodo que acabamos de crear. - Casi terminando, salimos del bucle, a este punto ya iteramos sobre ambas listas de nodos, solo nos queda tratar en caso de que, al final, tengamos un valor
rtodavia guardado, en dicho caso, solo nos queda almacenar este ultimo valor en un nodo y actualizar como en el paso anterior. - Finalmente, retornamos el primer nodo, o la cabeza de la lista, a partir de la cual podemos obtener todo el resto de nodos
# Codigo
| |