题目描述:

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

    先占坑.以后再修改 昨天遇到一道题, Given int Rand(1) =  0或者 1- uniformly distributed,   write a function to implemen ...

  2. SRM588

    250: 有n首歌每首歌有duration和tone,连续唱m首歌会消耗每首歌的duration以及相邻两首歌的tone的差的绝对值的和,给个T,问说在T时间内最对能唱多少歌. 将歌按tone排序后发 ...

  3. P154、面试题28:字符串的排列

    题目:输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab.cba. 测试用例: 1)功能测试( ...

  4. 理解extern char s[100]与extern char *s

    在x.c中定义了一个字符数组 char s[100],在l.c中进行引用extern char s[200], 有些c程序新手经常把它写成extern char *s. 这两种写法的含义一样吗? 首先 ...

  5. Android 系统的四层结构

    从上图中可以看出,Android 系统架构为四层结构,从上层到下层分别是应用程序层(Applications). 应用程序框架层 (Application Framework).系统运行库层(Libr ...

  6. 工具----IcoFX

    IcoFX IcoFX 是一款免费的图标编辑工具,让您轻松创建 Windows XP 和 Windows Vista 图标. 在编辑区您可以轻松的预览.保存.更改您的图标.您可以将您喜欢的图像转换为图 ...

  7. vijosp1507郁闷的出纳员

    一道平衡树实现的名次树,用了treap实现. 1.rand()产生的数可能比INF大,很可能改变树的结构. 2.删除时先递归,然后再删除自己,实现就变得简单多了. 3.因为很多情况树会是空的,所以设了 ...

  8. BMap介绍

    API引用路径: <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&am ...

  9. 在SQL Server实现最短路径的搜索

    开始 这是去年的问题了,今天在整理邮件的时候才发现这个问题,感觉顶有意思的,特记录下来. 在表RelationGraph中,有三个字段(ID,Node,RelatedNode),其中Node和Rela ...

  10. shell 全局和局部变量

    /******************************************************************** * shell 全局和局部变量 * 声明: * 到目前为止, ...