Mi sembra di sì, anche se forse potrebbe semplificarsi un po' il codice.

E' un po' che non tratto liste in C e potrei aver fatto qualche sciocchezza (anche se ho provato la funzione e funge...) comunque ho scritto questo codice di esempio

codice:
#include <stdio.h>
#include <stdlib.h>

struct nodo {
     char c;
     struct nodo *next;
};

typedef struct nodo NODO;

typedef NODO * LINK;

LINK visita(LINK lista1, LINK lista2, int *n) { /*n viene passato per riferimento e ha valore 0*/

     LINK temp1 = lista1;
     LINK temp2 = lista2;

     LINK nuova_lista = (LINK) malloc(sizeof(NODO));

     /* poiché le liste hanno uguale lunghezza e poiché vengono scorse parallelamente,
        finita l'una sarà finita necessariamente anche l'altra, quindi eseguo il controllo
        solo su una di esse */
     while ( temp1 != NULL ) {

          if ( temp1->c == temp2->c ) {

                  if ( *n == 0 )

                     nuova_lista = temp1;

                  else

                     nuova_lista->next = temp1;

                  *n = *n + 1;
          }

          temp1 = temp1->next;
          temp2 = temp2->next;
     }

     return nuova_lista;
}