已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 3 5 -1
2 4 6 8 10 -1
输出样例:
1 2 3 4 5 6 8 10
算法分析:链表基本操作,利用尾插法进行建表, 依次比较两个链表元素,小的值先加入新的链表中(用尾插法,因为要求递增,如果要求递减,用头插法可以实现)注意,当一个链表为空时,另一个链表不一定为空,此处需判断
#include<bits/stdc++.h>
using namespace std;
struct LNode
{
int data;
LNode *next;
};
void merge(LNode *&A,LNode *B)///两个链表的合并,因为没有开辟新的链表来存结果,而是用A链表存结果
{
LNode *p=A->next;
LNode *q=B->next;
LNode *s,*r;
A->next=NULL;
r=A;
while(p!=NULL && q!=NULL)
{
if(p->data <= q->data)///尾插法
{
s=p;
p=p->next;
r->next=s;
r=s;
}
else
{
s=q;
q=q->next;
r->next=s;
r=s;
}
}
while(p!=NULL)
{
s=p;
p=p->next;
r->next=s;
r=s;
}
while(q!=NULL)
{
s=q;
q=q->next;
r->next=s;
r=s;
}
}
void creathead(LNode *&L,int a[],int n)///尾插建立链表
{
LNode *r,*s;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
r=L;
for(int i=0; i<n; i++)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=a[i];
r->next=s;
r=r->next;
}
r->next=NULL;
}
int a[1000001],b[1000001];
int main()
{
LNode *A,*B;
int i=0,n,m,x;
while(1)
{
scanf("%d",&x);
if(x!=-1)
a[i++]=x;
else
break;
}
n=i;
i=0;
while(1)
{
scanf("%d",&x);
if(x!=-1)
b[i++]=x;
else
break;
}
m=i;
creathead(A,a,n);
creathead(B,b,m);
merge(A,B);
if(A->next!=NULL)
{
printf("%d",A->next->data);
A=A->next;
}
else
{
printf("NULL\n");
return 0;
}
while(A->next!=NULL)
{
printf(" %d",A->next->data);
A=A->next;
}
return 0;
}