已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的并集新非降序链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−表示序列的结尾(−不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出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;
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct LNode *List;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode,*LinkList;
Status InitList(LinkList &L)
{
L = new LNode;
L -> next = NULL;
return OK;
}
Status IsEmpty(LinkList &L)
{
if(L == NULL || L -> next == NULL)
{
return OK;
}
else
return ERROR;
}
Status CreatList(LinkList &L)
{
LNode *p,*q;
L = new LNode;
L ->next = NULL;
p = L;//指向链表头结点
q = new LNode;//新结点
ElemType e;
cin>>e;
while(e != -1)
{
q -> data = e;//新结点赋值e
q -> next = NULL;//将next置空
p -> next = q;//链表指向新结点,后插法
p = q;
q = new LNode;
cin>>e;//输入直到-1
}
}
void PrintList(LinkList &L)
{
LNode *p = L ->next;
while(p)
{
if(p -> next == NULL)
{
cout<<p -> data<<endl;
}
else
cout<<p -> data<<" ";
p = p -> next;
}
}
Status MergeList(LinkList &L1,LinkList &L2,LinkList &L3)
{
LNode *p1 = L1 -> next;
LNode *p2 = L2 -> next;
L3 = L1;//L1头结点作为L3头结点
LNode *p3 = L3;
while(p1 && p2)
{
if(p1->data < p2 -> data)
{
p3 -> next = p1;
p3 = p1;
p1 = p1 -> next;
}
else
{
p3 -> next = p2;
p3 = p2;
p2 = p2 -> next;
}
}
p3 -> next = p1 ? p1 :p2;//若有一个未到达末尾直接接到L3
delete L2;
}
int main()
{
LinkList L1,L2,L3;
InitList(L1);
InitList(L2);
InitList(L3);
CreatList(L1);
CreatList(L2);
MergeList(L1,L2,L3);
if(IsEmpty(L3))
{
cout<<"NULL"<<endl;
}
else
PrintList(L3);
}