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

函数接口定义:

 
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;
} /* 你的代码将被嵌在这里 */
 

输入样例:

3
1 3 5
5
2 4 6 8 10
 

输出样例:

1 2 3 4 5 6 8 10
NULL
NULL


#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); /* 细节在此不表 */
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(void){
List L = (List)malloc(sizeof(struct Node));
List p,rear,t;
rear = L;
L->Next = NULL;
int n,data;
scanf("%d",&n);
while (n--) {
scanf("%d",&data);
p = (PtrToNode)malloc(sizeof(struct Node));
p->Data = data;
p->Next = NULL;
rear->Next = p;
rear = p;
}
return L;
} void Print( List L ){
List p = L->Next;
int flag = 0;
if(p == NULL){
printf("NULL\n");
return;
}
while (p) {
if(!flag){
flag = 1;
printf("%d",p->Data);
}else{
printf(" %d",p->Data);
}
p = p->Next;
}
printf("\n");
} List Merge( List L1, List L2 ){
List p = (List)malloc(sizeof(struct Node));
List rear = p;
List t;
p->Next = NULL;
List t1 = L1->Next, t2 = L2->Next;
while (t1 && t2) {
t = (List)malloc(sizeof(struct Node));
t->Next = NULL;
if(t1->Data <= t2->Data){
t->Data = t1->Data;
rear->Next = t;
rear = t;
t = t1;
t1 = t1->Next;
free(t);
// printf("%d\n",rear->Data);
}else{
t->Data = t2->Data;
rear->Next = t;
rear = t;
t = t2;
t2 = t2->Next;
free(t);
// printf("%d\n",rear->Data);
}
}
while (t1) {
t = (List)malloc(sizeof(struct Node));
t->Next = NULL;
t->Data = t1->Data;
rear->Next = t;
rear = t;
t = t1;
t1 = t1->Next;
free(t);
// printf("%d\n",rear->Data);
}
while (t2) {
t = (List)malloc(sizeof(struct Node));
t->Next = NULL;
t->Data = t2->Data;
rear->Next = t;
rear = t;
t = t2;
t2 = t2->Next;
free(t);
// printf("%d\n",rear->Data);
}
L1->Next = NULL;
L2->Next = NULL;
return p;
}

PTA两个有序链表序列的合并的更多相关文章

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

    6-5 两个有序链表序列的合并 (15 分)   本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列. 函数接口定义: List Merge( List L1, List L ...

  2. 02-线性结构1 两个有序链表序列的合并(15 point(s)) 【链表合并】

    02-线性结构1 两个有序链表序列的合并(15 point(s)) 本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列. 函数接口定义: List Merge( List L ...

  3. 浙江大学PAT上机题解析之2-11. 两个有序链表序列的合并

    已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的并集新非降序链表S3. 输入格式说明: 输入分2行,分别在每行给出由若干个正整数构成的非降序序列,用-1表示序列的结尾(-1不属于这个序列) ...

  4. [刷题] PTA 02-线性结构1 两个有序链表序列的合并

    程序: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef int ElementType; 5 typedef st ...

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

    本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个递增的整数序列. 函数接口定义: List Merge( List L1, List L2 ); 其中List结构定义如下: typedef ...

  6. 【LeetCode题解】21_合并两个有序链表

    目录 21_合并两个有序链表 描述 解法一:迭代 思路 Java 实现 Python 实现 解法二:递归 思路 Java 实现 Python 实现 21_合并两个有序链表 描述 将两个有序链表合并为一 ...

  7. [LeetCode] 21. 合并两个有序链表

    题目链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/ 题目描述: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定 ...

  8. [Swift]LeetCode21. 合并两个有序链表 | Merge Two Sorted Lists

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...

  9. 合并两个有序链表的golang实现

    将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 输入:->->, ->-> 输出:->->->->-> ...

  10. LeetCode(21. 合并两个有序链表)

    问题描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1-& ...

随机推荐

  1. linux kernel 常用函数记录

    offsetof是用来判断结构体中成员的偏移位置 container_of宏用来根据成员的地址来获取结构体的地址 bitwise 是用来确保不同位方式类型不会被弄混 (小端模式,大端模式,cpu 尾模 ...

  2. accept 类型列表

    *.3gpp audio/3gpp, video/3gpp 3GPP Audio/Video *.ac3 audio/ac3 AC3 Audio *.asf allpication/vnd.ms-as ...

  3. java8 升级 17 兼容测试 emt4j

    测试兼容性的,emt4j 在readme 里 download 节目,点击下载 https://github.com/adoptium/emt4j /root/emt4j-0.3/bin/analys ...

  4. git clone 指定分支/指定commit

    方法一 下载整个branch及历史记录,文件较大,耗时 git clone --depth 1 [git-url] -b [branch-name] git reset --hard [commit- ...

  5. mysql数据库连接客户端过多

    flush hosts; 清理连接 查看当前连接数 show PROCESSLIST 与 show full PROCESSLIST (查看当前数据库所有连接,包含空闲连接与活跃连接) 查看最大连接数 ...

  6. div 自动高度

    问题: 一个页面分上下二部分,上部分高度是固定不变的,要求下部分高度自动占满屏幕,如何实现? 第一感觉是准备用 JS 实现. 今天发现一个用 CSS 实现的方法 position: fixed; bo ...

  7. unity 变体 随手记

    1 #pragma multi_compile AAA BBB#pragma multi_compile CCC DDDAAA CCCAAA DDDBBB CCCBBB DDD------------ ...

  8. 区分CommonJs/ES6 Module/AMD/CMD

    模块加载方式 CommonJs ES6 Module AMD CMD UMD Commonjs和ES6 Module的区别 总结 1.CommonJS CommonJS 是一个项目,其目标是为 Jav ...

  9. VisualSvn-Server搭建

    一.安装VisualSvn-Server 1.安装向导 2.同意许可 3.选择组件 4.选择版本(选择"标准版本",企业版需要收费) 5.服务器设置 6.安装 7.安装中 8.安装 ...

  10. 其他4-shell脚本后台运行知识

    1. 用途和方法 在实际工作中,一般会通过ssh连接服务器,隐藏可能就会有脚本或命令在执行期间不能中断的需求,若中断,则不仅前功尽弃,还可能破坏系统数据,下面是防止脚本执行终端的3种方法: 1)使用s ...