7-1 两个有序链表序列的合并(20 分)
已知两个非降序链表序列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
语言:c++
#include<stdio.h>
#include<stdlib.h>
#include<mm_malloc.h>
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void Init_L(LinkList &L)
{
L = new LNode;
L->next = NULL;
}
void ListCreate_L(LinkList &L)
{
L = new LNode;
L->next = NULL;
LNode *r = L;//尾指针指向头结点
LNode *t;
int x;
cin>>x;
while(x != -1)
{
t = new LNode;
t->data = x;
t->next = NULL;
r->next = t;
r = t;
cin>>x;
}
r->next = NULL;
}
void ListPrint_L(LinkList &L)
{
if(L->next != NULL)
{
LNode *p = L->next;
while(p != NULL)
{
if(p->next == NULL)
cout<<p->data;
else
cout<<p->data<<" ";
p = p->next;
}
}
else
cout<<"NULL";
cout<<endl;
}
void MergeList_L(LinkList &c, LinkList &a, LinkList &b)
{
c = a;
LNode *aa = a->next;
LNode *bb = b->next;
LNode *cc = c;
while(bb&&aa)
{
if(aa->data > bb->data)
{
cc->next = bb;
cc = bb;
bb = bb->next;
}
else
{
cc->next = aa;
cc = aa;
aa = aa->next;
}
}
if(aa)
{
cc->next = aa;
}
else
cc->next = bb;
}
int main ()
{
LinkList a, b, c;
Init_L(a);
Init_L(b);
Init_L(c);
ListCreate_L(a);
ListCreate_L(b);
MergeList_L(c, a, b);
ListPrint_L(c);
return 0;
}