PTA两个有序链表序列的合并 分数 20 作者 DS课程组 单位 浙江大学

已知两个非降序链表序列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;
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

约束112

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值