剑指Offer - 九度1519 - 合并两个排序的链表
2013-11-30 22:04
题目描述:

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
(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. NULL一定要检查到位,否则会被鄙视
    2. 合并链表要把原链表的节点拼成一条,而不是new出一堆新的节点,否则会被严重鄙视
    3. 可以new出一个节点指向表头,这样能省点代码量。但对于频繁调用的函数,一次多余的new、delete都不应该有。
  下面是ac的代码,当时写的时候貌似偷懒了...,第三条没做到。时间复杂度O(m + n),空间复杂度O(1)。
 // 651961    zhuli19901106    1519    Accepted    点击此处查看所有case的执行结果    1024KB    1802B    230MS
//
#include <cstdio>
using namespace std; struct Node{
int val;
struct Node *next;
Node(int _val = ): val(_val), next(NULL){}
}; int main()
{
int n, m;
int i, tmp;
struct Node *h1, *h2, *h3;
struct Node *p1, *p2, *p3;
struct Node *r1, *r2, *r3; while(scanf("%d%d", &n, &m) == ){
if(n <= && m <= ){
printf("NULL\n");
continue;
}
r1 = new Node();
r2 = new Node();
r3 = new Node(); p1 = r1;
for(i = ; i < n; ++i){
scanf("%d", &tmp);
p1->next = new Node(tmp);
p1 = p1->next;
}
h1 = r1->next; p2 = r2;
for(i = ; i < m; ++i){
scanf("%d", &tmp);
p2->next = new Node(tmp);
p2 = p2->next;
}
h2 = r2->next; p3 = r3;
while(h1 != NULL && h2 != NULL){
if(h1->val < h2->val){
p1 = h1->next;
p3->next = h1;
p3 = p3->next;
p3->next = NULL;
h1 = p1;
}else{
p2 = h2->next;
p3->next = h2;
p3 = p3->next;
p3->next = NULL;
h2 = p2;
}
} while(h1 != NULL){
p1 = h1->next;
p3->next = h1;
p3 = p3->next;
p3->next = NULL;
h1 = p1;
} while(h2 != NULL){
p2 = h2->next;
p3->next = h2;
p3 = p3->next;
p3->next = NULL;
h2 = p2;
} h3 = r3->next;
printf("%d", h3->val);
p3 = h3->next;
while(p3 != NULL){
printf(" %d", p3->val);
p3 = p3->next;
}
printf("\n"); while(r3->next != NULL){
p3 = r3->next;
r3->next = p3->next;
delete p3;
} delete r1;
delete r2;
delete r3;
r1 = r2 = r3 = NULL;
} return ;
}

剑指Offer - 九度1519 - 合并两个排序的链表的更多相关文章

  1. 剑指offer十六之合并两个排序的链表

    一.题目 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 二.思路 注:链表1和链表2是两个递增排序的链表,合并这两个链表得到升序链表为链表3. 首先分析 ...

  2. 【剑指Offer】16、合并两个排序的链表

      题目描述:   输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.   解题思路:   首先需要判断几个特殊情况,即判断输入的两个指针是否为空.如果第一个 ...

  3. 剑指Offer:面试题17——合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路1: 分别用p1,p2两个指针扫描两个有序链表,p3指针去构建新链表h3. p1.val & ...

  4. 剑指offer(16)合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 重点抓住这两个链表都是单挑递增的,因此我们只需要不断地比较他们的头结点就行,明显这是个 ...

  5. 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先

    剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...

  6. 剑指Offer - 九度1512 - 用两个栈实现队列

    剑指Offer - 九度1512 - 用两个栈实现队列2013-11-29 21:23 题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 输入: 每个输入 ...

  7. 剑指Offer - 九度1352 - 和为S的两个数字

    剑指Offer - 九度1352 - 和为S的两个数字2014-02-05 18:15 题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于 ...

  8. 剑指Offer - 九度1505 - 两个链表的第一个公共结点

    剑指Offer - 九度1505 - 两个链表的第一个公共结点2013-11-24 20:09 题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例.对于每个测试案例 ...

  9. 剑指Offer - 九度1348 - 数组中的逆序对

    剑指Offer - 九度1348 - 数组中的逆序对2014-01-30 23:19 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个 ...

随机推荐

  1. linux挂载和卸载NAS操作

    1.建立准备挂载NFS的目录,例如:cd /home/test,mkdir my_NFS_Catalog 2.挂接NFS至 /home/test/my_NFS_Catalog目录下(nas有两种格式: ...

  2. wxWidgets窗口类型

    如果在创建窗口的时候你没有指定窗口的边框类型,那么在不同的平台上将会有不同的边框类型的缺省值.在windows平台上,控件边框的缺省值为 wxSUNKEN_BORDER,意为使用当前系统风格的边框.你 ...

  3. 【JavaScript 封装库】BETA 5.0 测试版发布!

    JavaScript 前端框架(封装库) BETA 5.0 已于10月10日正式发布,今天开始提供 BETA 5.0 的 API 参考文献.相较于之前 5 个版本的发布都是草草的提供源代码,并没有很多 ...

  4. 二叉搜索树实现MAP

    二叉搜索树的基本实现. /* Date: 2014-04-29 purpose: An implementation of MAP using binary search tree. */ #ifnd ...

  5. 模拟停车POJ(3505)

    题目链接:http://poj.org/problem?id=3505 解题报告: #include <stdio.h> #include <iostream> #includ ...

  6. 详解 CSS 居中布局技巧

    水平居中元素: 通用方法,元素的宽高未知 方式一:CSS3 transform .parent { position: relative; } .child { position: absolute; ...

  7. Vuex基础-State

    官方地址:https://vuex.vuejs.org/zh/guide/state.html 由于 Vuex 的状态存储是响应式的,从 store 实例中读取状态最简单的方法就是在计算属性中返回某个 ...

  8. requireJS的学习

    官方文档 http://www.requirejs.cn/ 参考链接 http://www.w3cschool.cc/w3cnote/requirejs-tutorial-1.html http:// ...

  9. Linux 中将用户添加到指定组的指令

    将一个已有用户 testuser 增加到一个已有用户组 root 中,使此用户组成为该用户的附加用户组,可以使用带 -a 参数的 usermod  指令.-a 代表 append, 也就是将用户添加到 ...

  10. Webpack4 学习笔记一初探Webpack

    前言 此内容是个人学习笔记,以便日后翻阅.非教程,如有错误还请指出 Webpack 打包文件 支持JS模块化 模式: production(0配置默认), development(生产环境) 更详细的 ...