有了第一次处理死循环的经验,这一次轻松多了~
就是要注意出现死循环的条件,要记得给出所有情况的方法,不然程序就会卡住不动。
两个表会出现:
一个空一个非空,两个非空,两个空的情况。Union的时候要判断全了~
AC代码:(很长,惭愧惹)
#include<iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void createList(LinkList &L)
{
int n;
L=new LNode;
L->next=NULL;
LinkList p,r=L;//r是扫描指针
while(cin>>n)
{
if(n==-1) break;
p=new LNode;
p->data=n;
p->next=NULL;
r->next=p;
r=p;
}
}
void Union(LinkList s1,LinkList s2,LinkList &s3)
{
s3=new LNode;
s3->next=NULL;
LinkList r=s3,p1=s1->next,p2=s2->next;
//先比较第一个:两个都非空表的情况
if(p1&&p2)
{
if(p1->data==p2->data)
{
LinkList p=new LNode;
p->data=p2->data;
p->next=NULL;
r->next=p;
r=p;
p2=p2->next;
p1=p1->next;
}
else if(p1->data<p2->data)
{
LinkList p=new LNode;
p->data=p1->data;
p->next=NULL;
r->next=p;
r=p;
p1=p1->next;
}
else if(p1->data>p2->data)
{
LinkList p=new LNode;
p->data=p2->data;
p->next=NULL;
r->next=p;
r=p;
p2=p2->next;
}
}
//有至少一个空表
else
{
//先放第一个
if(p1)
{
LinkList p=new LNode;
p->data=p1->data;
p->next=NULL;
r->next=p;
r=p;
p1=p1->next;
}
else if(p2)
{
LinkList p=new LNode;
p->data=p2->data;
p->next=NULL;
r->next=p;
r=p;
p2=p2->next;
}
//再往后放
while(p1)
{
if(r->data<p1->data)
{
LinkList p=new LNode;
p->data=p1->data;
p->next=NULL;
r->next=p;
r=p;
}
p1=p1->next;
}
while(p2)
{
if(r->data<p2->data)
{
LinkList p=new LNode;
p->data=p2->data;
p->next=NULL;
r->next=p;
r=p;
}
p2=p2->next;
}
}
//两个表都存在的情况
while(p1&&p2)
{
//要先判断是否相同
if(p1->data==p2->data&&(r->data<p2->data))
{
LinkList p=new LNode;
p->data=p2->data;
p->next=NULL;
r->next=p;
r=p;
p2=p2->next;
p1=p1->next;
}
else if(p1->data<p2->data&&(r->data<p1->data))
{
LinkList p=new LNode;
p->data=p1->data;
p->next=NULL;
r->next=p;
r=p;
p1=p1->next;
}
else if(p1->data>p2->data&&(r->data<p2->data))
{
LinkList p=new LNode;
p->data=p2->data;
p->next=NULL;
r->next=p;
r=p;
p2=p2->next;
}
//注意,这里要设置都不满足的操作,不然又会死循环
//这里是r->data==p->data的情况
else
{
if(r->data==p1->data) p1=p1->next;
if(r->data==p2->data) p2=p2->next;
}
}
//有一遍已经循环完毕
while(p1)
{
if(p1->data>r->data)
{
LinkList p=new LNode;
p->data=p1->data;
p->next=NULL;
r->next=p;
r=p;
p1=p1->next;
}
else
{
p1=p1->next;
}
}
while(p2)
{
if(p2->data>r->data)
{
LinkList p=new LNode;
p->data=p2->data;
p->next=NULL;
r->next=p;
r=p;
p2=p2->next;
}
else p2=p2->next;
}
}
int main()
{
LinkList s1,s2,s3;
createList(s1);
createList(s2);
Union(s1,s2,s3);
if(s3->next==NULL)
{
cout<<"NULL";
return 0;
}
LinkList p=s3->next;
int temp=0;
while(p)
{
if(temp) cout<<" ";
cout<<p->data;
p=p->next;
temp++;
}
return 0;
}