Escribió la siguiente función para fusionar dos listas enlazadas:
var mergeTwoLists = function(l1, l2) { current = l1.head; if (current === null){ l1.head = l2.head; //Have to use l1.head instead of current since if we assign current again to l2.head the current will just start pointing to l2.head and lose reference to l1. } else{ while( current.next != null){ current = current.next; } current.next = l2.head; } return l1; };Creando dos listas enlazadas:
let l1 = new linkedlist(); let l2 = new linkedlist(); l1.insert(1); l1.insert(2); l1.insert(4); l2.insertEnd(1); l2.insertEnd(3); l2.insertEnd(4);Ahora llamé a la función dos veces:
let l3 = mergeTwoLists(l1,l2); console.log(l3.show()); let l4 = mergeTwoLists(l1,l2); console.log(l4.show())El primer programa genera el esperado 4 2 1 1 3 4. Sin embargo, la segunda llamada realiza un bucle infinito y sigue generando 4 2 1 1 3 4 1 3 4 1 3 4 1 3 4 ........
¿Por qué está pasando esto?
mergeTwoLists no hace copias de los nodos de la lista. Entonces, después de la primera fusión, el último nodo de l1 es el mismo que el último nodo de l2 . Cuando los vuelve a fusionar, la next propiedad del último nodo en l2 ahora apunta a l2.head , lo que da como resultado una lista circular, como si hubiera hecho mergeTwoLists(l2, l2) .
Si no desea que esto suceda, debe definir una función copyList() y usar
current.next = copyList(l2).head;