miren, encontre estos bugs:
BUGS BUGS BUGS BUGS BUGS BUGS BUGS BUGS BUGS BUGS BUGS BUGS
BUG0: if (!(*ppn1) || (0 < memcmp((*ppn1)->m_bData, (*ppn2)->m_bData, sizeof((*ppn2)->m_bData)))) este condicional evalua T independientemente del resultado de memcmp; en C++ el OR se evalua en short circuit; debido a que en una expresion logica con OR basta que una de las expresiones sea T para evaluar toda la sentencia a T la comparacion no ocurre jamas y se procede a la insercion independientemente del valor de orden de los buffers.
BUG1: for ( ; *ppn1 || *ppn2; ppn1 = &((*ppn1)->m_next)) en esta sentencia quiero llamar la atencion a la condicional "*ppn1 || *ppn2" es una condicional OR; por lo tanto basta con que *ppn1 o *ppn2 evalue a un valor distinto de NULL para que la accion del ciclo se realice; pues bien, que ocurre cuando *ppn1 es NULL y *ppn2 no lo es? se produce un AV (access violation) en ppn1 = &((*ppn1)->m_next)
BUG2: if (!(*ppn1) || (0 < memcmp((*ppn1)->m_bData, (*ppn2)->m_bData, sizeof((*ppn2)->m_bData)))) si *ppn1 apunta a NULL el hecho de que el primer miembro de la condicional evalue a F no impide que el segundo miembro sea evaluado lo que lleva a un AV en memcmp((*ppn1)->m_bData, (*ppn2)->m_bData, sizeof((*ppn2)->m_bData))
BUG3: si pn2 es una lista vacia se produce un AV en pn2 = (*ppn2)->m_next; puesto pn1 es vacia y if (!(*ppn1) || (0 < memcmp((*ppn1)->m_bData, (*ppn2)->m_bData, sizeof((*ppn2)->m_bData)))) evalua a T.
BUG4: si pn2 tiene solo elementos mas grandes que el maximo elemento de pn2 no se inserta ningun elemento de pn2 y la lista retornada como resultado es solo pn1
BUG5: *ppnv no es necesaria puesto que pn1 solo se actualiza cuando se inserta al principio de la lista.
Como se resuelven estos problemas?

y hay otros bugs? .. alguien me puede ayudar con esto? ...