题目描述:

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
(hint: 请务必使用链表。)

输入:

输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数。
下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素。接下来一行包含m个元素,s(1<=t<=1000000)。

输出:

对应每个测试案例,
若有结果,输出相应的链表。否则,输出NULL。

样例输入:

样例输出:
NULL

解题思路:

  首先给定了两个有序的链表,那么可以考虑使用三个指针,p1指向链表1,p2指向链表2,p3指向合并后的链表3.那么依次扫描链表1和2,每次把小的元素放到p3的后面,p3再指向链表3的尾巴。最后要仔细考虑的问题:
  1 如果两个链表都为空
if(n1 ==  && n2 == )
printf("NULL\n");
  2 如果其中一个链表为空
    if(head1->next == NULL){
res->next = head2->next;
return ;
}
if(head2->next == NULL){
res->next = head1->next;
return ;
}
  3 如果一个链表提前扫描完
        Node *p1;
Node *p2;
Node *p3 = res;
while(head1->next != NULL && head2->next != NULL){
p1 = head1->next;
p2 = head2->next;
if(p1->number < p2->number){
head1->next = p1->next;
p1->next = p3->next;
p3->next = p1;
p3 = p3->next;
}else{
head2->next = p2->next;
p2->next = p3->next;
p3->next = p2;
p3 = p3->next;
}
}
if(head1->next == NULL)
p3->next = head2->next;
if(head2->next == NULL)
p3->next = head1->next;
  解决了这三个问题,就完成了链表的排序。

代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int number;
struct node * next;
}Node;
void mergeList(Node *res,Node *head1,Node *head2);
int main(){
int n1,n2;
int i;
int temp;
while(scanf("%d %d",&n1,&n2)!=EOF && n1>= && n1<= && n2>= && n2<=){
Node *head1 = (Node *)malloc(sizeof(Node));
Node *head2 = (Node *)malloc(sizeof(Node));
head1->next = NULL;
head2->next = NULL;
Node *tail1 = head1;
Node *tail2 = head2;
for(i=;i<n1;i++){
scanf("%d",&temp);
Node *p = (Node *)malloc(sizeof(Node));
p->next = tail1->next;
tail1->next = p;
p->number = temp;
tail1 = tail1->next;
}
for(i=;i<n2;i++){
scanf("%d",&temp);
Node *p = (Node *)malloc(sizeof(Node));
p->next = tail2->next;
tail2->next = p;
p->number = temp;
tail2 = tail2->next;
}
Node *res = (Node *)malloc(sizeof(Node));
mergeList(res,head1,head2);
if(n1 == && n2 == )
printf("NULL\n");
else{
Node *p = res->next;
printf("%d",p->number);
p = p->next;
while(p != NULL){
printf(" %d",p->number);
p = p->next;
}
printf("\n");
}
}
return ;
}
void mergeList(Node *res,Node *head1,Node *head2){
if(head1->next == NULL){
res->next = head2->next;
return ;
}
if(head2->next == NULL){
res->next = head1->next;
return ;
}
Node *p1;
Node *p2;
Node *p3 = res;
while(head1->next != NULL && head2->next != NULL){
p1 = head1->next;
p2 = head2->next;
if(p1->number < p2->number){
head1->next = p1->next;
p1->next = p3->next;
p3->next = p1;
p3 = p3->next;
}else{
head2->next = p2->next;
p2->next = p3->next;
p3->next = p2;
p3 = p3->next;
}
}
if(head1->next == NULL)
p3->next = head2->next;
if(head2->next == NULL)
p3->next = head1->next;
return ;
}
/**************************************************************
Problem: 1519
User: xhalo
Language: C
Result: Accepted
Time:250 ms
Memory:4212 kb
****************************************************************/

剑指OFFER之合并有序链表(九度OJ1519)的更多相关文章

  1. 【剑指offer】合并有序链表

    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. *思路:假设两个链表的当前结点为n1(list1),n2(list2)比较链表结点值的大小,如果n1.va ...

  2. 剑指offer 56.删除有序链表中的重复结点

    56. 删除有序链表中的重复结点 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3-> ...

  3. 剑指OFFER之丑数(九度OJ1214)

    题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输 ...

  4. 剑指OFFER之矩形覆盖(九度OJ1390)

    题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入 ...

  5. 剑指OFFER之跳台阶(九度OJ1388)

    题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n< ...

  6. 剑指OFFER之重建二叉树(九度OJ1385)

    题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7 ...

  7. 剑指Offer:合并两个排序的链表【25】

    剑指Offer:合并两个排序的链表[25] 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 每次都是比较箭头节点,把小节点连接到已经合 ...

  8. 【剑指Offer】合并两个排序的链表 解题报告(Python)

    [剑指Offer]合并两个排序的链表 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interview ...

  9. 《剑指offer》 合并两个排序的链表

    本题来自<剑指offer> 合并两个排序的链表 题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路: A:采用递归的方式(C++ C ...

随机推荐

  1. 120. Triangle

    题目: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjace ...

  2. php实现自动运行文件

    autoexec.php <?php ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行. set_time_limit(30); // ...

  3. 【转】Picasso – Android系统的图片下载和缓存类库

    来源:http://blog.chengyunfeng.com/?p=492 另一篇参考:http://blog.csdn.net/xu_fu/article/details/17043231 Pic ...

  4. cookie分析

    浏览器cookie分析 简单点说就是数据存储,通过JavaScript将要保存的数据保存在客户端浏览器,下次打开网页时调用保存的cookie.浏览器中cookie保存的形式:user=aa; pwd= ...

  5. Java盲点:双重检查锁定及单例模式

    尊重原创: http://gstarwd.iteye.com/blog/692937 2004 年 5 月 01 日 所有的编程语言都有一些共用的习语.了解和使用一些习语很有用,程序员们花费宝贵的时间 ...

  6. Java这点事

    1--代码片段:  1 2 3 4 5 byte b1=1,b2=2,b3,b6;  final byte b4=4,b5=6;  b6=b4+b5;  b3=(b1+b2);  System.out ...

  7. Innodb buffer pool/redo log_buffer 相关

    InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理.在数据库系统中,由于CPU速度和磁盘速度之前的鸿沟,通常使用缓冲池技术来提高数据库的整体性能. 1. Innodb_buffe ...

  8. MD5加密帮助类

    using System; using System.Collections.Generic; using System.Text; namespace AIMSCommon { /// <su ...

  9. 关于word2010中完美解决数学公式(正斜体)输入的解决方案

    测试环境 win10(64位) office2010(32位)——64位的没有测试,估计应该也可以. 需要软件(包)(请按照下面顺序安装) ①VC运行库(自行百度下载即可) ②北大方正word公式数学 ...

  10. js 中&& 与 ||

    /*** 几乎所有语言中||和&&都遵循“短路”原理,* 如&&中第一个表达式为假就不会去处理第二个表达式,而||正好相反.* js也遵循上述原则.* 当||时,找到为 ...