Non è questione di "è più corretto", è questione che sono due cose completamente diverse.
Nelle due righe
sei riuscito a piazzare diversi errori:codice:NewNode.val = malloc(sizeof(stringa)); NewNode.val = stringa;
1. sizeof(stringa) non ti restituisce la lunghezza della stringa, ma le dimensioni di un char *; dovresti usare strlen(stringa)+1 (il +1 è per il carattere terminatore); ergo, stai allocando sempre 4 byte (su un sistema a 32 bit) invece delle dimensioni necessarie;
2. prima assegni a NewNode.val il puntatore restituito dalla malloc, quindi ci assegni il puntatore contenuto in stringa; il risultato è che (1) hai un memory leak (visto che così perdi il puntatore restituito dalla malloc) e (2) fai sì che val punti a stringa, e non ad una sua copia. Ovvero, se il chiamante usa lo stesso buffer (cambiandone via via il contenuto) per inizializzare tutti gli elementi della lista, tutti gli elementi finiranno con puntare alla stessa stringa.
Nota che in tutto questo la chiamata a malloc risulta assolutamente inutile, visto che scarti immediatamente il puntatore che ti ha restituito.
Come ti è stato detto, devi fare in maniera diversa:
1. alloca con malloc memoria sufficiente per la nuova stringa (nello specifico, strlen(stringa)+1);
2. copia la nuova stringa nella vecchia con strcpy.
In ogni caso, ti consiglio vivamente di ripassare i capitoli su stringhe e puntatori del tuo libro di C.