九度OJ-题目1519:合并两个排序的链表
来源:互联网 发布:永宏plc 编程口接线 编辑:程序博客网 时间:2024/05/16 05:00
题目链接地址:
九度OJ-题目1519:合并两个排序的链表
题目描述:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
(hint: 请务必使用链表。)
输入:
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数。
下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素。接下来一行包含m个元素,s(1<=t<=1000000)。
输出:
对应每个测试案例,
若有结果,输出相应的链表。否则,输出NULL。
样例输入:
5 2
1 3 5 7 9
2 4
0 0
样例输出:
1 2 3 4 5 7 9
NULL
解题思路:
(1)构造一个空链表head3用于存放合并后生成的链表;
(2)比较有序链表head1和head2中的元素,将较小的元素插入到链表head3的末尾;
(3)重复步骤(2),当链表head1和链表head2中的元素全部加入到链表head3后,算法运行结束。
AC代码如下:
#include<stdio.h>#include<malloc.h> // 定义链表中的结点typedef struct LNode{ int data; // 数据域 LNode * next; // 指针域}Linklist; /*** 构造长度为len的单链表* @param len 链表中的元素个数* @return head 返回单链表的头指针*/Linklist * createLinklist(int len){ Linklist * head = (Linklist *)malloc(sizeof(Linklist)); // 创建头结点 head -> next = NULL; Linklist * p = head; // p始终指向链表中的最后一个结点 Linklist * s = NULL; // s指向当前构造的结点 int i; int data; for(i = 1;i <= len;i++) { scanf("%d",&data); s = (Linklist *)malloc(sizeof(Linklist)); s -> data = data; s -> next = p -> next; p -> next = s; // 将s插入到p结点的后面 p = s; // p指向s } return head;} /*** 合并两个有序链表* @param head1 有序链表head1的头指针* @param head2 有序链表head2的头指针* @return 返回合并后链表的头指针*/Linklist * mergeTwoOrderLinklist(Linklist * head1,Linklist * head2){ Linklist * head3 = (Linklist *)malloc(sizeof(Linklist)); // 创建链表head3的头结点 head3 -> next = NULL; Linklist * p1 = head1 -> next; Linklist * p2 = head2 -> next; Linklist * p3 = head3; Linklist * s = NULL; // s指向链表head3正在构造的结点 // 当两个链表都不为空时,选择两个链表中较小的元素插入到链表head3中 while((p1 != NULL) && (p2 != NULL)) { s = (Linklist *)malloc(sizeof(Linklist)); if((p1 -> data) < (p2 -> data)) { s -> data = p1 -> data; p1 = p1 -> next; } else { s -> data = p2 -> data; p2 = p2 -> next; } s -> next = p3 -> next; p3 -> next = s; p3 = s; // p3始终指向链表head3中的最后一个结点 } // 将链表head1中的剩余结点全部插入到head3中 while(p1 != NULL) { s = (Linklist *)malloc(sizeof(Linklist)); s -> data = p1 -> data; p1 = p1 -> next; s -> next = p3 -> next; p3 -> next = s; p3 = s; // p3始终指向链表head3中的最后一个结点 } // 将链表head2中的剩余结点全部插入到head3中 while(p2 != NULL) { s = (Linklist *)malloc(sizeof(Linklist)); s -> data = p2 -> data; p2 = p2 -> next; s -> next = p3 -> next; p3 -> next = s; p3 = s; // p3始终指向链表head3中的最后一个结点 } return head3;} /*** 打印单链表* @param head 被打印链表的头指针* @return void*/void printLinklist(Linklist * head){ Linklist * p = head -> next; if(NULL == p) { printf("NULL\n"); } else { while(p -> next != NULL) { printf("%d ",p -> data); p = p -> next; } printf("%d\n",p -> data); // 输出链表的最后一个元素 }} int main(){ int n,m; Linklist * head1; // 第1个有序链表 Linklist * head2; // 第2个有序链表 Linklist * head3; // 合并后生成的链表 while(EOF != scanf("%d%d",&n,&m)) { head1 = createLinklist(n); head2 = createLinklist(m); head3 = mergeTwoOrderLinklist(head1,head2); printLinklist(head3); } return 0;} /************************************************************** Problem: 1519 User: blueshell Language: C++ Result: Accepted Time:280 ms Memory:7488 kb****************************************************************/
0 0
- 【剑指Offer面试编程题】题目1519:合并两个排序的链表--九度OJ
- 九度OJ-题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表-九度
- 九度 题目1519:合并两个排序的链表
- 九度oj-合并两个排序的链表
- 题目1519:合并两个排序的链表 九度 本地通过 参考别人的
- 九度_题目1519:合并两个排序的链表
- [九度OnlineJudge][剑指Offer]题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表
- 题目1519:合并两个排序的链表
- 剑指Offer题目1519:合并两个排序的链表
- JSPatch 实现原理详解
- Python 开发SQLite 两个例子
- DB2 修改表字段
- CodeForces463C Gargari and Bishops(贪心)
- 关闭Windows7, Windows8 , Windows8.1窗口左右停靠功能[图文]
- 九度OJ-题目1519:合并两个排序的链表
- android添加3个虚拟按键音
- (小练习)指向结构体的指针
- eclipse配置应用(不断更新中!)
- linux内核基础进程管理(是什么,简明)
- Mysql 创建,授权,删除用户
- android 签名文件生成及签名过的apk查看签名方法
- 第三章第42题
- java文件流模拟form表单上传文件