题目:输入两个递增的排序的链表,合并这两个链表并使新链表中的节点仍然是

按照递增排序的。例如链表1链表2合并为链表3.

  1. List1:->->->
  2.  
  3. List2:->->->
  4.  
  5. List3:->->->->->->->

链表结点定义如下:

  1. struct ListNode
  2. {
  3. int m_nValue;
  4. ListNode* m_pNext;
  5. }

其实我们可以简单梳理下流程如下:

1.两个指针分别指向List1和List2的头结点。设为ptr1和ptr2

2.比较ptr1和ptr2结点的值,ptr1<ptr2则ptr1则是合并后的链表头结点

3.ptr1向后移动一个结点此时再比较 ptr1>ptr2则将ptr2的节点插入到头结点之后

4.当ptr1或者ptr2到达末尾时 比如ptr1到达List1结尾后 若此时ptr2还未到List2结尾

   将ptr2插入到新排序的链表后面.

代码实现如下:

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct ListNode
  5. {
  6. int data;
  7. struct ListNode *next;
  8. };
  9.  
  10. struct ListNode* CreateList()
  11. {
  12. struct ListNode* Head,*p;
  13. Head=(struct ListNode*)malloc(sizeof(ListNode));
  14. Head->data=;
  15. Head->next=NULL;
  16. p=Head;
  17.  
  18. cout<<"Create List....(0-exit!)"<<endl;
  19. while(true)
  20. {
  21. int Data;
  22. cin>>Data;
  23. if(Data!=)
  24. {
  25. struct ListNode* NewNode;
  26. NewNode=(struct ListNode*)malloc(sizeof(ListNode));
  27. NewNode->data=Data;
  28. NewNode->next=NULL;
  29. p->next=NewNode;
  30. p=p->next;
  31. }
  32. else
  33. {
  34. break;
  35. }
  36. }
  37.  
  38. return Head->next;
  39. }
  40.  
  41. void PrintList(struct ListNode* Head)
  42. {
  43. cout<<"The List is: ";
  44.  
  45. struct ListNode *p;
  46. p=Head;
  47. while(p!=NULL)
  48. {
  49. cout<<p->data<<" ";
  50. p=p->next;
  51. }
  52. cout<<endl;
  53. }
  54.  
  55. struct ListNode* Merge(ListNode* pHead1,ListNode* pHead2)
  56. {
  57. if(pHead1==NULL&&pHead2==NULL)
  58. return NULL;
  59.  
  60. if(pHead1==NULL&&pHead2!=NULL)
  61. return pHead2;
  62.  
  63. if(pHead1!=NULL&&pHead2==NULL)
  64. return pHead1;
  65.  
  66. struct ListNode *ptr1,*ptr2,*MergeList,*newhead;;
  67.  
  68. ptr1=pHead1;
  69. ptr2=pHead2;
  70.  
  71. if(ptr1->data>ptr2->data)
  72. {
  73. MergeList=ptr2;
  74. ptr2=ptr2->next;
  75. }
  76. else
  77. {
  78. MergeList=ptr1;
  79. ptr1=ptr1->next;
  80. }
  81.  
  82. newhead=MergeList;
  83.  
  84. while(ptr1!=NULL&&ptr2!=NULL)
  85. {
  86. if(ptr1->data>ptr2->data)
  87. {
  88. MergeList->next=ptr2;
  89. ptr2=ptr2->next;
  90. MergeList=MergeList->next;
  91. }
  92.  
  93. if(ptr1->data<ptr2->data)
  94. {
  95. MergeList->next=ptr1;
  96. ptr1=ptr1->next;
  97. MergeList=MergeList->next;
  98. }
  99. }
  100.  
  101. if(ptr1!=NULL)
  102. {
  103. while(ptr1!=NULL)
  104. {
  105. MergeList->next=ptr1;
  106. ptr1=ptr1->next;
  107. MergeList=MergeList->next;
  108. }
  109. MergeList->next=NULL;
  110. }
  111. if(ptr2!=NULL)
  112. {
  113. while(ptr2!=NULL)
  114. {
  115. MergeList->next=ptr2;
  116. ptr2=ptr2->next;
  117. MergeList=MergeList->next;
  118. }
  119. MergeList->next=NULL;
  120. }
  121.  
  122. return newhead;
  123. }
  124.  
  125. int main()
  126. {
  127. ListNode *List1,*List2,*MergeList;
  128. List1=CreateList();
  129. PrintList(List1);
  130. List2=CreateList();
  131. PrintList(List2);
  132. MergeList=Merge(List1,List2);
  133. PrintList(MergeList);
  134. return ;
  135. }

运行截图:

剑指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 合并两个排序的链表 Java版

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

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

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

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

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

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

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

随机推荐

  1. IT技术如何转向销售创业

    广州 IT 网友  14:14:10 本人本科软件工程毕业,现在在一家公司做开发(不是很技术的那种),工作接近两年感觉自 己不适合这个行业,想换销售行业,不愿意在做技术.打算从事本行业的销售,老师给点 ...

  2. yum笔记

    rpm --> yum HTML: HyperText Mark LanguageXML: eXtended Mark Language XML, JSON: 半结构化的数据 yum仓库中的元数 ...

  3. 恢复Linux下被误删除的文件(笔记)

    恢复Linux下被误删除的文件 [root@xuegod63 ~]# mount /dev/cdrom /mnt/ 分一个区:sda4  查找:extundelete 分一个区:sda4  [root ...

  4. Kafka在Linux环境下搭建过程

    准备工作 Kafka集群是把状态保存在Zookeeper中的,首先要搭建Zookeeper集群.由于我们之前的分布式系统中已经安装zookeeper服务,这里不进行zookeeper安装教程以及应用教 ...

  5. 批量创建prefab

    using UnityEngine; using System.Collections; using UnityEngine.UI; using System.IO; using UnityEdito ...

  6. Android系统默认Home应用程序(Launcher)的启动过程源代码分析

    在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个 Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home ...

  7. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  8. WEB服务器2--IIS架构(转)

    开始之前可以先读:http://www.cnblogs.com/tiantianle/p/5419445.html 原文:http://www.cnblogs.com/arbin98/archive/ ...

  9. C#邮件发送

    public static void CreateCopyMessage() { MailAddress from = new MailAddress("yang@163.com" ...

  10. JS中面向对象的,对象理解、构造函数、原型、原型链

    6.1 理解对象 6.1.1 对象属性类型 ECMS属性有两种类型:数据属性和访问器属性 1 数据属性 [[configurable]] 表示能否通过Delete 删除属性从而从新定义属性,能否修改属 ...