关于归并算法出错的提问

这个算法的归并部分有什么问题?求解释
#include
#include
typedef int ElemType;
typedef int status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList InitLinkList( )
{
LinkList L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
return L;
}

/*LinkList Create(LinkList L,int n)逆位序输入
{
LinkList p;
int i;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
for( i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}

}*/
void Create(LinkList L)
{
int n;
LinkList p,q;
p=L;
printf("请输入结点个数n和n个数据元素:\n");
scanf("%d",&n);
while (n--)
{
q=(LinkList)malloc(sizeof(LNode));
scanf("%d",&q->data);
q->next=NULL;
p->next=q;
p=q;
}
}
void Print(LinkList L)
{
int num=0;
LinkList p;
p=L->next;
while (p)
{
num++;
printf("%d ",p->data);
p=p->next;
}
printf("\n该链表长度为%d\n",num);
}
status GetElem(LinkList L,int i)
{
int j;
ElemType e;
LinkList p;
p=L->next;
j=1;
while(p&&j {
p=p->next;
j++;
}
if(!p||j>i)
printf("错误!程序强制退出!");
exit(!0);
e=p->data;
return e;
}
status ListInsert(LinkList L,int i,ElemType e)
{
int j;
LinkList p,s;
p=L;
j=0;
while (p&&j {
p=p->next;
++j;
}
if(!p||j>i-1)
printf("错误!程序强制退出!");
exit(!0);
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
void Delete(LinkList L,int i)
{
LinkList p,q;
int j=0;
p=L;
while(p->next&&j {
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
printf("错误!程序强制退出!");
exit(!0);
q=p->next;
p->next=q->next;
free(q);
}
LinkList MergeList(LinkList La,LinkList Lb)
{
LinkList pa,pb,pc,Lc;
pa=La->next;
pb=Lb->next;
Lc=La;
pc=La;
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
pc->next=pa?pa:pb;
}
free(Lb);
return pc;
}
int main()
{
int i,get,a,b,Del;
LinkList la,lb,lc,l;
/* printf("-----创建链表阶段-----\n");
l=InitLinkList( );
Create(l);
//int n;逆位序输入所需代码
//printf("请输入欲创建的函数的结点个数:");逆位序输入所需代码
//scanf("%d",&n);逆位序输入所需代码
//l=Create(l,n);逆位序输入所需代码
Print(l);
printf("-----查找数据阶段-----\n");
printf("请输入欲查找的位置:");
scanf("%d",&i);
get=GetElem(l,i);
printf("查找得这个位置上的数据为:%d\n",get);
printf("-----插入数据阶段-----\n");
printf("请输入欲插入的位置:");
scanf("%d",&a);
printf("请输入插入的数据:");
scanf("%d",&b);
ListInsert(l,a,b);
Print(l);
printf("-----删除数据阶段-----\n");
printf("请输入欲删除的数据的位置:\n");
scanf("%d",&Del);
Delete(l,Del);
Print(l);*/
printf("-----归并链表阶段-----\n");
printf("请输入链表La的数据:");
la=InitLinkList( );
Create(la);
printf("请输入链表Lb的数据:");
lb=InitLinkList( );
Create(lb);
lc=MergeList(la,lb);
Print(lc);
return 0;
}

原谅我没看出这是归并!!归并算法,指的是将两个已经排序的序列合并成一个序列的操作,如果你得La和Lb都是无序的,怎么排?

附上:我自己写的 http://blog.csdn.net/tutuxs/article/details/52878391

这里面有归并(C++实现),主要看下思路,明白什么是归并就可以了

这是修改后的代码

LinkList MergeList(LinkList La, LinkList Lb)
{
    LinkList pa, pb, pc, Lc;
    pa = La->next;
    pb = Lb->next;
    pc = La;
    Lc = pc;
    while (pa&&pb)
    {
        if (pa->data <= pb->data)
        {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        }
        else
        {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
        pc->next = pa ? pa : pb;
    }
    free(Lb);
    return Lc;
}

在源代码中,当while循环退出的条件是pa和pb 中至少有一个为空

如果pa 为空(此时pb也可能为空),那么在while内部中

pc->next = pa ? pa : pb;

// 如果pa: 1->2->3->null
// 如果pb: 4->5->6->null
// 那么操作后应该为:1->2->3->pb (即是1->2->3->4->5->6->null)
// 此时pc指向的是pb这个节点(即是4->5->6->null)!!!

所以需要另一个指针指向该合并链表的头结点,否则输出的话不是在头结点输出的!