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