Non hai corretto come ti dicevo... in primis, non dovevi sostituire l'if con un while, e la condizione è sbagliata: devi continuare anche se uno solo dei due è diverso da NULL (ovvero, devi continuare il merge anche se una delle due liste è finita, copiando solo il contenuto dell'altra).
Inoltre, se uno dei due puntatori è NULL, devi evitare di raggiungere il confronto tra firstPtr->i e secPtr->i, altrimenti siamo da capo.
Io farei semplicemente:
codice:List1Ptr merge(List1Ptr *s1Ptr, List1Ptr *s2Ptr) { List1Ptr firstPtr=*s1Ptr; List1Ptr secPtr=*s2Ptr; List l; List1Ptr currPtr=&l; while(firstPtr!=NULL || secPtr!=NULL) { if(secPtr==NULL || firstPtr->i < secPtr->i) { currPtr->nextPtr=firstPtr; currPtr=firstPtr; firstPtr=firstPtr->nextPtr; currPtr->nextPtr=NULL; } else { currPtr->nextPtr=secPtr; currPtr=secPtr; secPtr=secPtr->nextPtr; currPtr->nextPtr=NULL } } return l.nextPtr; }