两个链表头节点分别是La,Lb
一、将所有在Lb中,不在La中的数据元素插入到La中
int LocateElem(List *head,int e){//查找在链表中有没有数据域是e的节点,有的话返回1,否则0
List *p=head->next;
while(p){
if(p->data==e)
return 1;
}
return 0;
}
void InsertElem(List *head,int e){ //头插法
List *p=(List *)malloc(sizeof(List));
p->data=e;
p->next=head->next;
head->next=p;
}
void unionList(List *La,List *Lb){//线性链表合并
int e;
List *p=Lb->next;
while(p){
e=p->data;
if(!LocateElem(La,e))
InsertElem(La,e);
p=p->next;
}
}
二、将两个非递减线性链表La、Lb合并为一个新的非递减线性表
元素可以重复
- 算法思想:(1)创建一个空链表Lc,(2)依次从La和Lb中摘取较小的节点插入到Lc表的最后,直到其中 一个变为空表位置,(3)继续将La或者Lb中还剩下元素的那些节点插到Lc的最后
List* LinkList(List *La,List *Lb){
List *pa,*pb,*pc;//pc指向新链表Lc的尾节点,因为都是非递减链表,所以使用尾插法
List *Lc;
Lc=pc=La; //利用La的头节点作为Lc的头节点
pa=La->next;
pb=Lb->next;
while(pa&&pb){
if(pa->data<=pb->data){
pc->next=pa;
pc=pc->next;//更新pc指向Lc的尾节点
pa=pa->next;
}
else{
pc->next=pb;
pc=pc->next;
pb=pb->next;
}
}
pc->next=pa?pa:pb;//将剩下的元素插入到LC的尾部
free(Lb);
return Lc;
}
三、如果将二的要求改为将两个非递减线性表合并成一个非递增线性表
算法思想:只需要将二中的代码改为对Lc进行头插法,即每次都在头节点后第一个位置上插入La和Lb中较小的元素即可,最后只需要将剩下的元素依次插入Lc的头部。
四、将两个无重复的递增链表合并成一个无重复的递增链表
和上面的二代码类似,不过加上了相等的判断条件
List* LinkList(List *La,List *Lb){
List *pa,*pb,*pc;
List *Lc;
Lc=pc=La;
pa=La->next;
pb=Lb->next;
while(pa&&pb){
if(pa->data<pb->data){
pc->next=pa;
pc=pc->next;
pa=pa->next;
}
else if(pa->data>pb->data){
pc->next=pb;
pc=pc->next;
pb=pb->next;
}
else{//相等的时候
pa=pa->next;
pb=pb->next;
pc=pc->next;
}
}
pc->next=pa?pa:pb;
free(Lb);
return Lc;
}