算法:两个升序单链表的合并
将两个按值排序的带头结点的单链表La和Lb排列成一个升序的
单链表,并返回一个新的单链表的表头指针
(两个升序合并成升序,用尾插法)
LinkList Merge_LinkList(LNode* La, LNode* Lb)
{
//准备工作
LNode* Lc;//新链表的头结点
LNode* pc;//新链表的工作指针
LNode* pa;//La的工作指针
LNode* pb;//Lb的工作指针
LNode* ptr;//用于删除结点时保存指针
Lc = La;//Lc用La的头结点
pc = La;//pc用于尾指针
pa = La->next;//工作指针初始化
pb = Lb->next;//工作指针初始化
//合并
while (pa != NULL && pb != NULL)
{
if (pa->data < pb->data)
{
pc->next = pa;
pc = pa;//pa尾插
pa = pa->next;//pa后移
}
else if (pa->data > pb->data)
{
pc->next = pb;
pc = pb;//pb尾插
pb = pb->next;//pb后移
}
else//相等
{
pc->next = pa;
pc = pa;//二者插一个即可
pa = pa->next;//后移
ptr = pb;
pb = pb->next;//将另一个删除
free(ptr);
}
}
if (pa != NULL)//pa不空
pc->next = pa;//将pa接到pc的后继结点
if (pb != NULL)
pc->next = pb;
free(Lb);//释放Lb链表
return Lc;
}