PI-ITBA / 2024_02

Consultas 2C 2024
4 stars 0 forks source link

TP10ej04 #121

Open bleite12 opened 4 weeks ago

bleite12 commented 4 weeks ago

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).

        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;
    }
TList addAllCREOQUEESTAMAL(TList lista1,  TList lista2){

    if(lista2 == NULL ){
        return lista1;
    }

    if (lista1 == NULL) {
        lista1 = lista2;
        return lista1; 
    }

       // Si el elemento de lista2 es mayor que el actual en lista1 y menor que el siguiente en lista1.
    if (lista1->elem < lista2->elem && (lista1->tail == NULL || lista2->elem < lista1->tail->elem)) {
        // Insertar lista2 en esta posición.
        TList siguiente = lista2->tail; //si o hago este aux se "pierde"
        lista2->tail = lista1->tail;
        lista1->tail = lista2;
        // Continuar con el siguiente elemento de lista2.
        return addAll(lista1, siguiente);
    }

       // Si los elementos son iguales, avanzar en ambas listas para evitar duplicados.
    if (lista1->elem == lista2->elem) {
        lista1->tail =  addAll(lista1->tail, lista2->tail);
        return lista1;
    }

    // Si no se cumple la condición, avanzar en lista1.
    lista1->tail = addAll(lista1->tail, lista2);
    return lista1;
}

TList addAll(TList lista1,  TList lista2){

    if(lista2 == NULL ){
        return lista1;
    }

    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;
    }

       // Si los elementos son iguales, avanzar en ambas listas para evitar duplicados.
    if (lista1->elem == lista2->elem){
        lista1->tail = addAll(lista1->tail, lista2->tail);
        return lista1;
    }

    // Si no se cumple la condición, avanzar en lista1.
    lista1->tail = addAll(lista1->tail, lista2);
    return lista1;
}
marcelogarberoglio commented 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

tomaspietravallo commented 4 weeks ago

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.

bleite12 commented 3 weeks ago

clarisimo Gracias.