已知两个非降序链表序列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<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10000000//宏定义一个大小为一千万的内存空间。(我个人PTA上最大测试点为一千万)
typedef struct
{
int *elem;
int length;
} SqList;//定义线性表。
void InitList(SqList &l);
void InitList(SqList &l)
{
l.elem = (int*)malloc(sizeof(int)*MAXSIZE);
//或直接用l.elem=(int*)malloc(MAXSIZE);//因为elem为int型,所以前面用int;
//关于malloc:申请空间;分配的大小是参数,返回值是指针。
l.length = 0;
}//线性表的初始化。
int main()
{
int i = 0, j = 0, k = 0, m = 0, n = 0, z = 0;
SqList l1, l2, newl;
InitList(l1);
InitList(l2);
InitList(newl);//传入函数体中,将线性表初始化。
do {
scanf("%d", &l1.elem[i]);
i++; l1.length++;
} while (l1.elem[i - 1] != -1);
do {
scanf("%d", &l2.elem[j]);
j++; l2.length++;
} while (l2.elem[j - 1] != -1);
//为线性表输入数据。
for (k = 0; l1.elem[m] != -1 && l2.elem[n] != -1; k++)
{
if (l1.elem[m] > l2.elem[n])
{
newl.elem[k] = l2.elem[n];
n++;
}
else
{
newl.elem[k] = l1.elem[m];
m++;
}
newl.length++;
}
if (l1.elem[m] = -1)
{
while (l2.elem[n] != -1)
{
newl.elem[k] = l2.elem[n];
n++; k++; newl.length++;
}
}//线性表的合并,必有其一先截止,所以将未截止的线性表中其余数据放入新表。
else
{
while (l1.elem[m] != -1)
{
newl.elem[k] = l1.elem[n];
m++; k++; newl.length++;
}
}
if (k == 0)//当两个两表均为空时的判定。此判定可有多种方式,如newl.elem[0]==-1,newl.length==0;
{
printf("NULL");
return 0;
}
for (z = 0; z < k; z++)
{
if (z != 0)printf(" ");
printf("%d", newl.elem[z]);
}//新表输出。
return 0;
}