已知两个非降序链表序列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 100
#define ERROR -1
#define OK 1
typedef int ElemType;
typedef struct{
ElemType Data[MAXSIZE];
int Length;
}SqList;
int InsertList(SqList *L,int n){
if(L->Length==MAXSIZE)
return ERROR;
L->Data[L->Length] = n;
L->Length++;
return OK;
}
int CompareList(SqList *L1,SqList *L2){
int Loc1 = 0, Loc2 = 0;
int i = 0;
//利用i来判断是否是第一个,用于解决结尾不能有空格的情况
while(Loc1<L1->Length&&Loc2<L2->Length){
if(L1->Data[Loc1]<L2->Data[Loc2]){
if(i==0){
printf("%d", L1->Data[Loc1]);
i++;
}
else{
printf(" %d", L1->Data[Loc1]);
i++;
}
Loc1++;
}
else{
if(i==0){
printf("%d", L2->Data[Loc2]);
i++;
}
else{
printf(" %d", L2->Data[Loc2]);
i++;
}
Loc2++;
}
}
//用于解决二者不同长或者其中一者为空。
if(Loc1==L1->Length){
for (int j = Loc2; j < L2->Length;j++){
if(i==0){
printf("%d", L2->Data[j]);
i++;
}
else{
printf(" %d", L2->Data[j]);
i++;
}
}
}
else if(Loc2==L2->Length){
for (int j = Loc1; j < L1->Length;j++){
if(i==0){
printf("%d", L1->Data[j]);
i++;
}
else{
printf(" %d", L1->Data[j]);
i++;
}
}
}
if(i==0)
printf("NULL");
return OK;
}
int main(){
SqList L1, L2;
L1.Length = 0;
L2.Length = 0;
while(1){
int n;
scanf("%d", &n);
if(n==-1)
break;
else
InsertList(&L1, n);
}
while(1){
int n;
scanf("%d", &n);
if(n==-1)
break;
else
InsertList(&L2, n);
}
CompareList(&L1, &L2);
return 0;
}
方法二
用链表解决
List Merge( List L1, List L2 ){
List head = (List)malloc(sizeof(List));
List p = head;
List a = L1->Next;
List b = L2->Next;
while(a && b){
if(a->Data > b->Data){
p->Next = b;
b = b->Next;
}else{
p->Next = a;
a = a->Next;
}
p = p->Next;
}
p->Next = a ? a : b;
L1->Next = NULL;
L2->Next = NULL;
return head;
}
精华部分
p->Next = a ? a : b;
运行到此处,L1,L2必有一个为空,进行判断,直接串起后面的