Ho appena visto le liste e ho provato a fare un merge (che ovviamente non farà a caso tuo) ma in ogni caso prova a guardare se ti può servire...
codice:
#include <stdio.h>
#include <stdlib.h>

typedef struct cella * LIST;

struct cella{
	int cont;
	LIST next;
};

void inser_ordinato (int x, LIST * punLL);
void print (LIST LL);

void main(){
	LIST L1=NULL, L2=NULL;
	int val=0;

	while(true){
		printf("\nInserisci un valore nella 1a lista. 10000 per uscire\n");
		scanf("%d", &val);
		if (val==10000) break;
		inser_ordinato(val, &L1);
	}

	while(true){
		printf("\nInserisci un valore nella 2a lista. 10000 per uscire\n");
		scanf("%d", &val);
		if (val==10000) break;
		inser_ordinato(val, &L2);
	}

//faccio il merge delle liste passando alla funzione inserimento ordinato L1 com lista
//e L2->cont come valore
	while(L2 != NULL){
		inser_ordinato(L2->cont, &L1);
		L2=L2->next;
	}

	print(L1);
}

void inser_ordinato (int x, LIST * punLL){
	LIST prec=NULL, succ=NULL;
	LIST aux;

	aux = (LIST) calloc (1, sizeof (struct cella));
	aux->cont = x;

	if((* punLL == NULL) || x < (* punLL)->cont){
		aux->next = * punLL;
		* punLL = aux;
	}
	else{
		prec = * punLL;
		succ = (* punLL)->next;
		while((succ != NULL) && (succ->cont < x)){
			succ = succ->next;
			prec = prec->next;
		}
		aux->next = succ;
		prec->next = aux;
	}
}

void print (LIST LL){

	printf("\nLista:\n");
	while (LL != NULL){
		printf("%d ", LL->cont);
		LL = LL->next;
	}
	printf ("\n");
}