题目描述:

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
(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. POJ2524——Ubiquitous Religions

    Ubiquitous Religions Description There are so many different religions in the world today that it is ...

  2. Android安全问题 静音拍照与被拍

    之前写过一些android手机root之后的安全问题的(文章列表见末尾),其实我是想到哪就写到了,今天整理硬盘,发现一年之前写过一段代码,所以今天我们就一起来讨论一下. 注:这里不是讨论多nb的技术, ...

  3. JS复制对象

    CSSCommonJS.DeepCopy = function (json) { if (typeof json == 'number' || typeof json == 'string' || t ...

  4. mmap

    http://www.360doc.com/content/11/0830/10/1964482_144428042.shtml

  5. mongoDB入门必读

    一.概述 MongoDB是一个基于分布式文件存储的数据库开源项目. 由C++语言编写,旨在为WEB应用提供可护展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品. ...

  6. netty 实现socket服务端编写

    import java.net.InetSocketAddress; import io.netty.bootstrap.ServerBootstrap; import io.netty.channe ...

  7. JQUERY 选择器 总结,比较全

    jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个 ...

  8. UVa 1644 (筛素数 + 二分) Prime Gap

    题意: 给出一个整数n,如果n是素数输出0,否则输出它后一个素数与前一个素数的差值. 分析: 首先用筛法把前十万个素数都筛出来,然后放到数组里.用二分找到不大于n的最大的素数的下标,如果这个素数等于n ...

  9. JAX-RS入门 三 :细节

    一.若希望一个Java类能够处理REST请求,则这个类必须至少添加一个@Path("/")的annotation:对于方法,这个annotation是可选的,如果不添加,则继承类的 ...

  10. java适配器模式

    原文查看:http://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html