题目:

输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然时按照递增排序的。

链表结点定义如下:

  1. struct ListNode{
  2. int val;
  3. ListNode* next;
  4. };

思路:

合并两个递增排序的链表,思想类似于归并排序的merge过程。

1、当两个链表均不为空,

如果链表1头结点的值小于链表2头结点的值,那么链表1的头结点作为新链表的头结点,否则链表2的头结点作为新链表的头结点,链表指针往前走一步;

对两个链表中剩余结点的操作同步骤1一样;(这是一个递归的过程)

2、当两个链表至少有一个为空,

新链表指针指向非空的那一个;

代码:

  1. struct ListNode{
  2. int val;
  3. ListNode* next;
  4. };
  5.  
  6. // recursive method
  7. ListNode* Merge_1(ListNode* pHead1, ListNode* pHead2){
  8. if(pHead1==NULL)
  9. return pHead2;
  10. if(pHead2==NULL)
  11. return pHead1;
  12. if(pHead1->val<pHead2->val){
  13. pHead1->next=Merge_1(pHead1->next,pHead2);
  14. return pHead1;
  15. }
  16. else{
  17. pHead2->next=Merge_1(pHead1,pHead2->next);
  18. return pHead2;
  19. }
  20. }
  21.  
  22. // non-recursive method
  23. ListNode* Merge_2(ListNode* pHead1, ListNode* pHead2){
  24. ListNode *p=new ListNode();
  25. ListNode *MergeHead=p;
  26. while(pHead1!=NULL && pHead2!=NULL){
  27. if(pHead1->val<pHead2->val){
  28. MergeHead->next=pHead1;
  29. pHead1=pHead1->next;
  30. }
  31. else{
  32. MergeHead->next=pHead2;
  33. pHead2=pHead2->next;
  34. }
  35. MergeHead=MergeHead->next;
  36. }
  37.  
  38. if(pHead1==NULL)
  39. MergeHead->next=pHead2;
  40. if(pHead2==NULL)
  41. MergeHead->next=pHead1;
  42.  
  43. return p->next;
  44. }

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/d8b6b4358f774294a89de2a6ac4d9337?rp=1

AC代码:

  1. class Solution {
  2. public:
  3. ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
  4. {
  5. if(pHead1==NULL)
  6. return pHead2;
  7. if(pHead2==NULL)
  8. return pHead1;
  9. if(pHead1->val<pHead2->val){
  10. pHead1->next=Merge(pHead1->next,pHead2);
  11. return pHead1;
  12. }
  13. else{
  14. pHead2->next=Merge(pHead1,pHead2->next);
  15. return pHead2;
  16. }
  17. }
  18. };
  1. class Solution {
  2. public:
  3. ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
  4. {
  5. ListNode *p=new ListNode(0);
  6. ListNode *MergeHead=p;
  7. while(pHead1!=NULL && pHead2!=NULL){
  8. if(pHead1->val<pHead2->val){
  9. MergeHead->next=pHead1;
  10. pHead1=pHead1->next;
  11. }
  12. else{
  13. MergeHead->next=pHead2;
  14. pHead2=pHead2->next;
  15. }
  16. MergeHead=MergeHead->next;
  17. }
  18.  
  19. if(pHead1==NULL)
  20. MergeHead->next=pHead2;
  21. if(pHead2==NULL)
  22. MergeHead->next=pHead1;
  23.  
  24. return p->next;
  25. }
  26. };

(剑指Offer)面试题17:合并两个排序的链表的更多相关文章

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

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

  2. 剑指Offer - 九度1519 - 合并两个排序的链表

    剑指Offer - 九度1519 - 合并两个排序的链表2013-11-30 22:04 题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.(hi ...

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

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

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

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

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

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

  6. 剑指offer-面试题17.合并两个排序的链表

    题目:输入两个递增的排序的链表,合并这两个链表并使新链表中的节点仍然是 按照递增排序的.例如链表1链表2合并为链表3. List1:->->-> List2:->->-& ...

  7. 《剑指offer》面试题17 合并两个排序的链表 Java版

    我的方法:新初始化一个链表头,比较两个链表当前节点的大小,然后连接到该链表中.遍历两个链表直到null为止. public ListNode merge(ListNode first, ListNod ...

  8. 【剑指offer】面试题 25. 合并两个排序的链表

    面试题 25. 合并两个排序的链表 NowCoder 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. Java 实现 ListNode Clas ...

  9. 【剑指Offer面试题】 九度OJ1518:反转链表

    与其非常快写出一段漏洞百出的代码,倒不如细致分析再写出鲁棒的代码. 提前想好測试用例(输入非空等等)进行測试改动代码. 题目链接地址: http://ac.jobdu.com/problem.php? ...

  10. 剑指offer面试题17:合并两个排序的链表

    题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点人是按照递增排序的.解题思路:两个链表分别都已经是有序的了,遍历链表的时候只要比较两个链表当前位置大小,取出最小的添加到新链表中. 可以有 ...

随机推荐

  1. ORACLE创建、修改、删除序列

    ORACLE没有象SQL SERVER中一样的自增加字段,要实现只能通过SEQUENCE来实现. 1.创建序列语法:(需要CREATE SEQUENCE系统权限) CREATE SEQUENCE 序列 ...

  2. 定时组件quartz系列<二>quartz的原理

    Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便.   一.核心概念   Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可.   1. ...

  3. tar 实现增量备份

    使用 tar -g 参数进行增量备份实验 完整备份: #执行完整备份tar -g snapshot -zcf back.tar.gz back #查看 tarball 内容[huzi@mail ~]$ ...

  4. 嵌入式 uboot以及kernel添加看门狗临时记录(个人记录未整理乱)

    Uboot_Kernerl_Add_Watch_Dog: U-Boot 2010.06 (Nov 01 2013 - 15:28:44) DRAM:  128 MiBCheck spi flash c ...

  5. mysql优化SQL语句的一般步骤及常用方法

    一.优化SQL语句的一般步骤 1. 通过show status命令了解各种SQL的执行频率 mysqladmin extended-status 或: show [session|global]sta ...

  6. 【PHP】linux搭建PHP运行环境

    之前在windows下写了hello world,终归是不够用啊,因为开发环境是Linux,怎么办呢~~~学习学习再学习 写在前面的话:我从百度文库的一个文章里摘出来的,原文章名称<Linux下 ...

  7. extern "c" 的作用

    作用:实现C和C++混合编程. 原理:C和C++编译器编译之后,函数名会编译成不同的名字,链接阶段名字查找会找不到目标,后面实例中会详解. 用法:①.c文件中定义的函数,.cpp文件要调用时,该.cp ...

  8. R工作空间

    工作空间,指的是你现有的R语言工作环境,它包括了任何一个用户定义的对象,比如:向量,矩阵,数据结构,列表,方法等.在一个R会话结束的时候,你可以保存现有的工作空间的映像,在下一次R启动的时候,该工作空 ...

  9. ShellExecute的各种用法

    一.利用系统默认的邮件收发器发送电子邮件 Uses ..., ShellAPI; Var lpHwnd: HWND; lpOperation, lpFile, lpParameters, lpDire ...

  10. 打造自己的Markdown编辑器

    原文链接:  http://www.errdev.com/post/5/ Markdown以其简洁的语法赢得了广大程序猿的喜爱,搜了一下github上相关的web编辑器,星星比较多的 Stackedi ...