PTA 两个有序链表序列的合并

来源:互联网 发布:手机淘宝里的跳蚤街 编辑:程序博客网 时间:2024/05/21 12:15

02-线性结构1 两个有序链表序列的合并(15 分)

本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。

函数接口定义:

List Merge( List L1, List L2 );

其中List结构定义如下:

typedef struct Node *PtrToNode;struct Node {    ElementType Data; /* 存储结点数据 */    PtrToNode   Next; /* 指向下一个结点的指针 */};typedef PtrToNode List; /* 定义单链表类型 */

L1L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1L2合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的链表头指针。

裁判测试程序样例:

#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 ); /* 细节在此不表;空链表将输出NULL */List Merge( List L1, List L2 );int main(){    List L1, L2, L;    L1 = Read();    L2 = Read();    L = Merge(L1, L2);    Print(L);    Print(L1);    Print(L2);    return 0;}/* 你的代码将被嵌在这里 */

输入样例:

31 3 552 4 6 8 10

输出样例:

1 2 3 4 5 6 8 10 NULLNULL
#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); /* 细节在此不表;空链表将输出NULL */


List Merge(List L1, List L2);


int main()
{
List L1, L2, L;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
Print(L);
Print(L1);
Print(L2);
return 0;
}


List Read() /* 细节在此不表 */
{
int n;
scanf("%d", &n);
List L, P;
P = L = (List)malloc(sizeof(struct Node));
if (n == 0)
{
L->Next = NULL;
return L;
}
P = L->Next = (List)malloc(sizeof(struct Node));
scanf("%d", &P->Data);
int i;
for (i = 1; i < n ; i++)
{
P->Next = (List)malloc(sizeof(struct Node));
P = P->Next;
scanf("%d", &P->Data);
}
P->Next = NULL;
return L;
}


void Print(List L)
{
if (!L->Next)
{
printf("NULL\n");
return;
}
L = L->Next;
while (L)
{
printf("%d ", L->Data);
L = L->Next;
}
printf("\n");
}


List Merge(List L1, List L2)
{
List L,head;
L = head = (List)malloc(sizeof(struct Node));
if (!L1->Next && !L2->Next)
{
L->Next = NULL;
return L;
}
List l1 = L1;
List l2 = L2;
L1 = L1->Next;
L2 = L2->Next;
l1->Next = NULL;
l2->Next = NULL;
if (L1->Data < L2->Data)
{
L->Next = L1;
L1 = L1->Next;
L = L->Next;
}
else
{
L->Next = L2;
L2 = L2->Next;
L = L->Next;
}
while (L1 || L2)
{
if (L1&&L2)               //如果L1、L2都没到链表尾部
{
if (L1->Data < L2->Data)
{
L->Next = L1;
L1 = L1->Next;
}
else
{
L->Next = L2;
L2 = L2->Next;
}
}
else if (!L1)              //如果L1到达链表尾部
{
L->Next = L2;
L2 = L2->Next;
}
else if (!L2)       //如果L2到达尾部
{
L->Next = L1;
L1 = L1->Next;
}
L = L->Next;
L->Next = NULL;
}
return head;
}



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 领导找人顶替我怎么办 宁夏超生了没钱交罚款怎么办? 户口年龄上大了怎么办 孩子年龄报小了怎么办 招工档案年龄有涂改怎么办 退伍军被别人顶替上班怎么办 二孩政策前生的怎么办 孩子晕车怎么办最有效方法得当 事业单位编外人员改革工伤怎么办 工伤仲裁后法院一审判决后怎么办 我媳妇删了我该怎么办 老婆离家出走不照顾小孩怎么办 车停在4s店损坏怎么办 车辆年检贴丢了怎么办 卖衣服别人嫌贵怎么办 武汉铁路医保卡丢了怎么办 高铁列车员年龄大了怎么办 尚客优酒店会员怎么办 钢铁雄心4人力不足怎么办 未经车主同意私自将车卖了怎么办 剧本给几个制片人看过怎么办 没有产品经理ui设计师怎么办 老板请朋友吃饭司机应该怎么办 被化妆学校坑了怎么办 快车约得太远怎么办 工资好低2000多怎么办 苹果手机不能下载软件怎么办 苹果手机下不了软件怎么办 苹果6s下不了软件怎么办 苹果6下不了软件怎么办 ipad更新系统卡住了怎么办 ipad卡住了关不了机怎么办 ipad卡住了没反应怎么办 苹果7下不了软件怎么办 苹果手机开机密码忘了怎么办 苹果开机密码忘了怎么办 我的ipad很卡怎么办 6s升级后卡顿严重怎么办 软件升级后手机卡顿怎么办 ps通道抠图模糊怎么办 电脑锁屏死机了怎么办