已知两个非降序链表序列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>
#include<malloc.h>

typedef struct Node{
    int Data;
    struct Node *Next;
} *List;
List Read();//读入链表

int main()
{
    List L1, L2, L3, LL3;//L1,L2为两个输入序列,L3为输出序列头结点,LL3为合并序列的循环变量
    L1 = Read();
	L2 = Read();
	L3 = (List)malloc(sizeof(List));//初始化
	L3->Next = NULL;
	L3->Data = -1;
	LL3 = L3;
	L1 = L1->Next;//头结点数据为-1,应从下一个结点开始合并
	L2 = L2->Next;
	while(L1 && L2){//L1,L2均不为空
        if(L1->Data < L2->Data){//比较大小
            LL3->Next = L1;//L1当前结点数据较小则L1插入LL3
            L1 = L1->Next;//L1当前结点后移
        }else{//否则对L2进行操作
            LL3->Next = L2;
            L2 = L2->Next;
        }
        LL3 = LL3->Next;//LL3当前结点后移
    }
	while(L1){//若L2已空L1不空,把L1结点顺次插入LL3
        LL3->Next = L1;
        L1 = L1->Next;
        LL3 = LL3->Next;
    }
	while(L2){//否则对L2进行操作
        LL3->Next = L2;
        L2 = L2->Next;
        LL3 = LL3->Next;
    }
    int flag = 0;//判断是否已有数据输出
    L3 = L3->Next;//跳过头结点
    if(!L3) printf("NULL\n");//若之后有节点
    while(L3){//当L3不空时
        if(flag) printf(" ");//若之前已有元素输出则输出空格
        printf("%d",L3->Data);//输出L3当前数据
        flag = 1;//已有数据输出,把flag置1
        L3 = L3->Next;//当前结点后移
    }
	return 0;
}
    
List Read(){
	List L, tmp, LL;//L为用来返回的头结点,tmp为暂存当前数据的节点,LL为循环变量
	int Data;//暂存数据
	L = (List)malloc(sizeof(List));//分配空间,头结点初始化
	L->Next = NULL;
	L->Data = -1;
	LL = L;
	scanf("%d",&Data);//先读入第一个数据,若为-1则不必进行后续循环
	while(Data!=-1){
		tmp = (List)malloc(sizeof(List));//tmp分配空间
		tmp->Data = Data;//tmp数据为当前读入的数据
		tmp->Next = NULL;//tmp相当于链表最后一个结点,Next为空
		LL->Next = tmp;//tmp插入表尾
		LL = LL->Next;//当前结点后移
		scanf("%d",&Data);//读入下一个数据
	}
	return L;//返回头结点
}	
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐