题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

常考题:

假设两个链表如下:

链表1:   1  ->  3 -> 5 -> 7

链表2:   2  ->  4 -> 6 -> 8

合并后链表3:1  ->  2 -> 3 -> 4 ->  5 -> 6 -> 7 -> 8

首先分析合并两个链表的过程。我们的分析从合并链表的头结点开始。链表1的头结点的值小于链表2的头结点的值,因此链表1的头结点将是合并后链表的头结点。

我们继续合并两个链表中剩余的结点。在两个链表中剩下的结点依然是排序的,因此合并这两个链表的步骤和前面的步骤是一样的。我们还是比较两个头结点的值。此时链表2的头结点的值小于链表1的头结点的值,因此链表2的头结点的值将是合并剩余结点得到的链表的头结点。我们把这个结点和前面合并链表时得到的链表的尾节点(值为1的结点)连接起来。

当我们得到的链表中值较小的头结点并把它链接到已经合并的链表之后,两个链表剩余的结点依然是有序的,因此合并的步骤和之前的步骤是一样的。这就是典型的递归过程

还需要注意的是代码的鲁棒性问题。每当代码试图访问空指针指向的内存时程序就会崩溃,从而导致鲁棒性问题。在本题中一旦输入空的链表就会引入空的指针,因此我们需要对空链表单独处理。当第一个链表是空链表,也就是它的头结点是一个空指针时,那么把它和第二个链表合并,显然合并的结果就是第二个链表。同样,当输入的第二个链表的头结点是空指针时,我们把它和第一个链表合并得到的结果就是第一个链表。如果两个链表都是空链表,合并的结果就是一个空链表。

递归的过程对于初学者来说(比如说我)还是比较难想通的,就算有参考代码。(我相信看多了就好了的,刚开始学什么都难)

这样,先简化两个链表,假设链表如下:

链表1:  1

链表2:  2

对照着下列程序分析,很容易理解,然后逐个增加链表的元素个数进行分析。。。。。。

class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        ListNode* pMergeHead=NULL;
        if(pHead1==NULL)
           return pHead2;
        if(pHead2==NULL)
           return pHead1;
        if(pHead1->val<pHead2->val)
           {
              pMergeHead=pHead1;
              pMergeHead->next=Merge(pHead1->next,pHead2);
           }
        else
           {
              pMergeHead=pHead2;
              pMergeHead->next=Merge(pHead1,pHead2->next);
           }
        return  pMergeHead;
    }
};

剑指offer面试题[17]-合并两个排序的链表相关推荐

  1. 剑指offer面试题25. 合并两个排序的链表(双指针)

    题目描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 思路 详见链接 代码 class Solution:def mergeTwolists(self, l1:List ...

  2. 剑指offer(C++)-JZ25:合并两个排序的链表(数据结构-链表)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排 ...

  3. 《剑指Offer》题目:合并两个排序的链表

    题目描述:输入两个单调递增的链表list1,list2,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析: 1.对于链表题目,首先考虑边界情况,即链表为空的情况,提升代码 ...

  4. 【剑指offer-Java版】17合并两个排序链表

    合并两个排序链表:老生常谈的内容了 while循环或者递归 注意:输入链表存在一个空或者两个空 public class _Q17 {public ListNode<Integer> Me ...

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

    剑指offer--面试题17:合并两个排序的链表 Solution1: 不要犯低级错误... /* struct ListNode {int val;struct ListNode *next;Lis ...

  6. 剑指offer——面试题37:两个链表的第一个公共结点

    剑指offer--面试题37:两个链表的第一个公共结点 20180906整理 Solution1: 时间复杂度为O(n2)O(n2)O(n^2)的垃圾算法 /* struct ListNode {in ...

  7. 剑指offer——面试题38:数字在排序数组中出现的次数

    剑指offer--面试题38:数字在排序数组中出现的次数 20180906整理 Solution1: [注意]先利用二分查找扎到一个值然后再顺序遍历的做法时间复杂度也是O(n)O(n)O(n),代码也 ...

  8. 剑指offer——面试题5:从尾到头打印链表

    剑指offer--面试题5:从尾到头打印链表 Solution1:我的答案 /** * struct ListNode { * int val; * struct ListNode *next; * ...

  9. 面试题25: 合并两个排序的链表

    /******************************************************************* *<剑指Offer--名企面试官精讲典型编程题>C ...

最新文章

  1. 基于java的IO流的文件读取系统
  2. WindowsPhone7真机部署和调试程序
  3. TX2+python+pytorch install
  4. C/C++中 static 的作用
  5. php session_start() 非常慢,php – session_start似乎很慢(但是有时候)
  6. 谁来执行Rebalance以及管理consumer的group呢?
  7. javaSE各阶段练习题--初识Java章节
  8. 微软拥抱开源_如何拥抱开源劳动力
  9. socket网络字节序相关概念
  10. 百度进军游戏;腾讯起诉抄袭者;苹果急撤 watchOS 5.1 更新 | 极客头条
  11. HTML中的一般标签、常用标签和表格
  12. Solr进阶之拼写纠错功能的实现基础拼音
  13. EAS BOS:序时簿中获取选中行中某单元格的值方法
  14. Linux 基础之基础网络ss命令
  15. java语言和裕语言_iApp 裕语言V5.0公测版
  16. 2019北京中考英语口语计算机考试,2019北京中考英语听说考试体验系统发布,附考试流程和注意事项...
  17. AI 量化机器人,人工智能如何助你从股市发家?
  18. Linux笔记——软件包管理
  19. matlab中Cci,CCI指标实战操作中使用技巧
  20. 天地在我心 2010-11-12

热门文章

  1. php 最大限制,php – ModSecurity最大发布限制(PCRE限制错误)
  2. python pandas 教程_Python pandas十分钟教程
  3. 【毕业设计】php+mysql社区交流系统(毕业论文+封面目录+系统+说明书)
  4. deepin php docker,Deepin15.10安装Docker
  5. linux非阻塞输入函数,Linux fcntl函数设置阻塞与非阻塞
  6. 计算机通信基础ppt,计算机网络第2章 数据通信基础知识要点课件.ppt
  7. webpack html自动引入,开发必备的webpack4
  8. IEEE754标准:二进位浮点数算术标准
  9. Axure RP9 自学之路1-软件初识
  10. web开发中的计算机网络知识——应用层