

有了第一次处理死循环的经验,这一次轻松多了~
就是要注意出现死循环的条件,要记得给出所有情况的方法,不然程序就会卡住不动。
两个表会出现:
一个空一个非空,两个非空,两个空的情况。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;
}
这篇博客分享了在处理链表合并时如何避免死循环的经验,详细分析了可能出现死循环的条件,并提供了完整的AC代码实现。文章涵盖了两种链表状态的合并:一个空一个非空,两个非空,以及两个空的情况。代码中特别注意了在不同情况下对节点的正确处理,以确保合并后的链表有序且无循环。
 20 分&spm=1001.2101.3001.5002&articleId=115256971&d=1&t=3&u=bba0850b0da54e1dac686397aa8e4acb)
6333

被折叠的 条评论
为什么被折叠?



