题目:
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。 要求S3中没有重复元素。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,要求链表中没有重复元素。数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
在这里给出一组输入。例如:
1 3 3 5 8 -1
2 3 4 6 8 10 -1
输出样例:
在这里给出相应的输出。例如:
1 2 3 4 5 6 8 10
代码:
#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*Linklist;
// 1 后插法创建链表
void CreateList(Linklist &L)
{
L=new LNode;
L->next=NULL;
Linklist p;
Linklist s=L;
int a;
while(cin>>a&&a!=-1)
{
p=new LNode;
p->data=a;
p->next=NULL;
s->next=p;
s=p;
}
}
// 2 链表归并
void MergeList(Linklist &La,Linklist &Lb,Linklist &Lc)
{
Linklist pa,pb,pc;
pa=La->next; pb=Lb->next;
Lc=La;
pc=Lc;
//La 和Lb 都非空
while(pa&&pb)
{
if(pa->data<pb->data&&pa->data!=pc->data)
{
pc->next=pa; pc=pa; pa=pa->next;
}
else if(pa->data>pb->data&&pb->data!=pc->data)
{
pc->next=pb; pc=pb; pb=pb->next;
}
else if(pa->data==pb->data&&pa->data!=pc->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
pb=pb->next;
}
else if(pa->data==pc->data) pa=pa->next;
else if(pb->data==pc->data) pb=pb->next;
}
while(pa)
{
if(pc->data!=pa->data)
{
pc->next=pa;pc=pa;
}
pa=pa->next;
}
while(pb)
{
if(pc->data!=pb->data)
{
pc->next=pb;pc=pb;
}
pb=pb->next;
}
pc->next=NULL;
}
int main()
{
Linklist La,Lb,Lc;
CreateList(La);
CreateList(Lb);
MergeList(La,Lb,Lc);
Linklist p=Lc->next;
if(p==NULL) cout<<"NULL";
while(p)
{
cout<<p->data;
if(p->next!=NULL) {cout<<" ";
}p=p->next;
}
return 0;
}