//链表A,B有序求并集到链表C
//C用原来的A链,释放B链
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//A,B有序求并集到C
//C用原来的A链,释放B链
LinkList Union_Link(LinkList &la,LinkList &lb){
LinkList pa,pb,pc,u;
pa=la->next;
pb=lb->next;
pc=la;
while(pa && pb){
if(pa->data == pb->data){
pc->next=pa;
pc=pa;
pa=pa->next;
u=pb;
pb=pb->next;
free(u);
}
else if(pa->data < pb->data){
u=pa;
pa=pa->next;
free(u);
}
else{
u=pb;
pb=pb->next;
free(u);
}
}
while(pa != NULL){
u=pa;
pa=pa->next;
free(u);
}
while(pb != NULL){
u=pb;
pb=pb->next;
free(u);
}
pc->next = NULL;
free(lb);
return la;
}
//带头节点的头插法
LinkList CreateList(LinkList &L){
LinkList s;
int x;
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
while(scanf("%d",&x)){
if(x==-1)break;
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
}
// printf("%2d",s->data);
// printf("%2d",L->next->data);
return L;
}
//带头节点的尾插法
LinkList rCreateList(LinkList &L){
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
LinkList r=L;
int x;
while(scanf("%d",&x),x!=-1){
LinkList s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=NULL;
r->next=s;
r=s;
}
return L;
}
//输出链表
void output(LinkList L){
LinkList p=L->next;
while(p){
printf("%-2d",p->data);
p=p->next;
}
}
int main(){
LinkList la,lb,lc,pa,pb;
//头插法
// pa=CreateList(la);
// pb=CreateList(lb);
//尾插法
pa=rCreateList(la);
pb=rCreateList(lb);
lc=Union_Link(pa,pb);
output(lc);
return 0;
}