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
代码如下:
#include <bits/stdc++.h>
using namespace std;
#define OVERFLOW -1
#define OK 1
typedef int Status;
typedef int Elemtype;
typedef struct LNode
{
Elemtype data;
struct LNode *next;
}LNode, *LinkList;
void ListPrint(LinkList &L)
{
LNode *p = L->next;
if(p == NULL)
cout << "NULL" << endl;
while(p != NULL)
{
if(p->next != NULL)
{
cout << p->data << " ";
}
else
cout << p->data;
p = p->next;
}
}
Status CreatList(LinkList &L)
{
LNode *p = L;
while(p ->next != NULL)
{
p = p->next;
}
int num;
cin >> num;
while( num != -1)
{
LNode* t = (LNode*)malloc(sizeof(LNode));
if(t == NULL)return OVERFLOW;
t->data = num;
t->next = p->next;
p->next = t;
p = p->next;
cin >> num;
}
return OK;
}
void AddList(LinkList &A, LinkList &B, LinkList &C)
{
LNode *pa = A->next;
LNode *pb = B->next;
LNode *pc = C;
while(pa && pb)
{
if(pa->data >= pb->data)
{
pc->next = pb;
pb = pb->next;
}
else
{
pc->next = pa;
pa = pa->next;
}
pc = pc->next;
}
pc->next = pa? pa:pb;
A->next = NULL;
B->next = NULL;
}
int main()
{
LinkList A = (LinkList)malloc(sizeof(LNode));
if(!A) return OVERFLOW;
A->next = NULL;
LinkList B = (LinkList)malloc(sizeof(LNode));
if(!B) return OVERFLOW;
B->next = NULL;
LinkList C = (LinkList)malloc(sizeof(LNode));
if(!C) return OVERFLOW;
C->next = NULL;
CreatList(A);
CreatList(B);
AddList(A, B, C);
ListPrint(C);
return 0;
}