Open bleite12 opened 4 weeks ago
En la primera esto está mal
if (lista1 == NULL) {
lista1 = lista2;
return lista1;
}
porque no estás agregando los nodos en la lista1, sólamente estás "enganchando" el final de la lista1 a un nodo de la lista2. Por ejemplo si la lista1 es 1 -> 3 y la lista2 es 2 -> 4-> 5-> 6 El último 3 de lista1 te queda apuntando al nodo con el 4 de la lista 2. Pero también el nodo con el 2 de la lista2 apuinta a ese mismo nodo. Cuando liberes la lista1 vas a estar liberando parte de la lista2. O si inserto el 10 en la lista2 también lo estará insertando en lista1.
Con respecto a este if
if (lista1 == NULL || lista1->elem > lista2->elem ) {
TList aux = malloc(sizeof(struct node));
aux->elem = lista2->elem;
aux->tail = addAll(lista1, lista2->tail);
return aux;
}
es una variante del add que hicimos en clase: si la lista es vacía o el head es mayor al elemento a insertar, entonces el nuevo head de la lista es el elemento a insertar. La única diferencia es que acá no se termina, porque no insertás un solo elemento, sino que tenés que seguir insertando en la sublista los elementos de la cola de lista2
Agregando a lo que dice Marcelo: Resalto que en el primero estas destruyendo la lista original (queda con los nodos de list1 enganchados entre medio, ya no es la misma lista), mientras que la segunda crea una copia de los valores y deja list2 intacta.
clarisimo Gracias.
Hola, buenas. Queria consultar porque la primera forma en la que hice este ejercicio no esta bien, creia que era porque perdia la referencia al siguiente elemento de la lista2, pero hice como una auxiliar "siguiente" para no perder la referencia y sigue sin estar bien. La segunda forma si los corre, pero queria preguntar cual seria la logica de este if (lo que hay adentro y la condicion).