已知两个非降序链表序列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
代码长度限制
16 KB
Python (python3)
时间限制
1500 ms
内存限制
256 MB
其他编译器
时间限制
1500 ms
内存限制
128 MB
答案一(差):
#include<stdio.h>
#include<stdlib.h>
typedef int ElementType;
typedef struct Node* PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read();
void print(List L);
List Merge(List L1, List L2);
int main()
{
List L1, L2, L;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
print(L);
return 0;
}
List Read() {
List L, Head, Tail;
Head = Tail = NULL;
int x;
while (1)
{
scanf("%d", &x);
if (x == -1)break;
L = (List)malloc(sizeof(List));
L->Data = x;
L->Next = NULL;
if (Head == NULL)Head = L;
else Tail->Next = L;
Tail = L;
}
return Head;
}
List Merge(List L1, List L2)
{
List L, Head, Tail;
Head = Tail = L = NULL;
while (1) {
if (L1 != NULL && L2 != NULL) {
if (L1->Data <= L2->Data)
{
L = (List)malloc(sizeof(List));
L->Data = L1->Data;
L->Next = NULL;
L1 = L1->Next;
}
else {
L = (List)malloc(sizeof(List));
L->Data = L2->Data;
L->Next = NULL;
L2 = L2->Next;
}
}
else if (L1 == NULL && L2 != NULL)
{
L = (List)malloc(sizeof(List));
L->Data = L2->Data;
L->Next = NULL;
L2 = L2->Next;
}
else if (L2 == NULL && L1 != NULL)
{
L = (List)malloc(sizeof(List));
L->Data = L1->Data;
L->Next = NULL;
L1 = L1->Next;
}
else break;
if (Head == NULL)Head = L;
else Tail->Next = L;
Tail = L;
}
return Head;
}
void print(List L) {
int t = 0;
if (L == NULL)printf("NULL");
else {
while (L)
{
t++;
if (t != 1)printf(" ");
printf("%d", L->Data);
L = L->Next;
}
}
}
答案二(优):
# include<stdio.h>
# include<stdlib.h>
typedef int ElementType;
typedef struct LNode* PtrToNode;
typedef struct LNode {
ElementType Data;
PtrToNode Next;
}LNode;
typedef PtrToNode List;
List Write();
List Merge(List L1, List L2);
void Print(List L);
int main()
{
List L1 = NULL, L2 = NULL, L = NULL;
L1 = Write();
L2 = Write();
L = Merge(L1, L2);
Print(L);
return 0;
}
List Write()
{
int x;
List head = NULL, tail = NULL, L = NULL;
while (1)
{
scanf("%d", &x);
if (x == -1)return head;
L = (List)malloc(sizeof(LNode));
L->Data = x;
L->Next = NULL;
if (head == NULL)head = L;
else tail->Next = L;
tail = L;
}
}
List Merge(List L1, List L2)
{
List head = NULL, tail = NULL, L = NULL;
while (1)
{
if (L1 && L2)
{
if (L1->Data <= L2->Data)
{
L = L1;
L1 = L1->Next;
L->Next = NULL;
if (head == NULL)head = L;
else tail->Next = L;
tail = L;
}
else
{
L = L2;
L2 = L2->Next;
L->Next = NULL;
if (head == NULL)head = L;
else tail->Next = L;
tail = L;
}
}
else if (L1 && !L2)
{
L = L1;
L1 = L1->Next;
L->Next = NULL;
if (head == NULL)head = L;
else tail->Next = L;
tail = L;
}
else if (!L1 && L2)
{
L = L2;
L2 = L2->Next;
L->Next = NULL;
if (head == NULL)head = L;
else tail->Next = L;
tail = L;
}
else return head;
}
}
void Print(List L)
{
int flag = 0;
if (!L)printf("NULL");
while (L)
{
if (flag == 0)printf("%d", L->Data);
else printf(" %d", L->Data);
flag = 1;
L = L->Next;
}
}
答案三(最优):
# include<stdio.h>
# include<stdlib.h>
typedef int ElementType;
typedef struct LNode* PtrToNode;
typedef struct LNode {
ElementType Data;
PtrToNode Next;
}LNode;
typedef PtrToNode List;
List Write();
List Merge(List L1, List L2);
void Print(List L);
int main()
{
List L1 = NULL, L2 = NULL, L = NULL;
L1 = Write();
L2 = Write();
L = Merge(L1, L2);
Print(L);
return 0;
}
List Write()
{
int x;
List head = NULL, tail = NULL, L = NULL;
while (1)
{
scanf("%d", &x);
if (x == -1)return head;
L = (List)malloc(sizeof(LNode));
L->Data = x;
L->Next = NULL;
if (head == NULL)head = L;
else tail->Next = L;
tail = L;
}
}
List Merge(List L1, List L2)
{
List head = NULL, tail = NULL, L = NULL;
while (1)
{
if (L1 && L2)
{
if (L1->Data <= L2->Data)
{
L = L1;
L1 = L1->Next;
L->Next = NULL;
if (head == NULL)head = L;
else tail->Next = L;
tail = L;
}
else
{
L = L2;
L2 = L2->Next;
L->Next = NULL;
if (head == NULL)head = L;
else tail->Next = L;
tail = L;
}
}
else break;
}
if (L1 && !L2)
{
if (head == NULL)head = L1;
else tail->Next = L1;
}
else if (!L1 && L2)
{
if (head == NULL)head = L2;
else tail->Next = L2;
}
return head;
}
void Print(List L)
{
int flag = 0;
if (!L)printf("NULL");
while (L)
{
if (flag == 0)printf("%d", L->Data);
else printf(" %d", L->Data);
flag = 1;
L = L->Next;
}
}