char * tab1 = new char [ ra ];
char * tab2 = new char [ rb ];
Nie bierzesz pod uwagę zera kończącego napis przy alokacji pamięci. Rozmiar obu tablic powinien być o jeden bajt większy.
char *zwracana = new char [ rozmiar * 2];
Tutaj to samo.
for ( int i = 0; i < rozmiar * 2; i++)
{
zwracana [ i ] = pomoc [ i ] ;
}
Tutaj brakuje przypisania zera na końcu tablicy zwracana.
Tak w ogóle wycieków pamięci tutaj cała masa. Nie wiem, czy SPOJ ma z nimi problem, ale radziłbym je zlikwidować.