【C/C++练习题】合并两个排序的链表

举报
王建峰 发表于 2021/11/19 01:15:08 2021/11/19
【摘要】 《剑指Offer》面试题25:合并两个排序的链表 1 题目 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入图3.11中的链表1和链表2,则合并之后的升序链表如链表3所示。   2 分析 递归思想,每次递归过程,将两个待合并链表的首节点中选出一个节点(作为合并之后的链表首节点)...

《剑指Offer》面试题25:合并两个排序的链表


1 题目

输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入图3.11中的链表1和链表2,则合并之后的升序链表如链表3所示。

 

2 分析

递归思想,每次递归过程,将两个待合并链表的首节点中选出一个节点(作为合并之后的链表首节点),然后在剩下范围内进行同样的操作(递归调用)。直到一方的首节点为NULL(递归结束)。

 

3 代码


  
  1. #include "iostream"
  2. #include "cstdlib"
  3. using namespace std;
  4. //问题:合并链表
  5. typedef struct node
  6. {
  7. int m_nValue;
  8. node* m_pNext;
  9. }ListNode;
  10. void Print_list_node(ListNode* pHead);
  11. ListNode* Merge_list(ListNode* pHead1, ListNode* pHead2);
  12. void test01()
  13. {
  14. ListNode* pHead1 = NULL;
  15. ListNode* pNode1 = NULL;
  16. ListNode* pHead2 = NULL;
  17. ListNode* pNode2 = NULL;
  18. pHead1 = (ListNode*)malloc(sizeof(ListNode));
  19. pNode1 = (ListNode*)malloc(sizeof(ListNode));
  20. pHead2 = (ListNode*)malloc(sizeof(ListNode));
  21. pNode2 = (ListNode*)malloc(sizeof(ListNode));
  22. if (pHead1 == NULL || pNode1 == NULL || pHead2 == NULL || pNode2 == NULL)
  23. {
  24. cout << "malloc fail" << endl;
  25. return ;
  26. }
  27. pHead1->m_nValue = 0;
  28. pHead1->m_pNext = pNode1;
  29. pNode1->m_nValue = 2;
  30. pNode1->m_pNext = NULL;
  31. pHead2->m_nValue = 1;
  32. pHead2->m_pNext = pNode2;
  33. pNode2->m_nValue = 3;
  34. pNode2->m_pNext = NULL;
  35. cout << "list1:\t\t";
  36. Print_list_node(pHead1); //打印链表节点信息
  37. cout << "list2:\t\t";
  38. Print_list_node(pHead2); //打印链表节点信息
  39. cout << "Merge list:\t";
  40. Print_list_node(Merge_list(pHead1, pHead2)); //合并后
  41. }
  42. int main(int argc, char const *argv[])
  43. {
  44. test01();
  45. return 0;
  46. }
  47. //功能:合并链表(递归算法)
  48. //输入:pHead1 pHead2 要合并的链表头节点指针
  49. //返回:合并后的头节点指针
  50. ListNode* Merge_list(ListNode* pHead1, ListNode* pHead2)
  51. {
  52. //1.考虑特殊情况
  53. if (pHead1 == NULL)
  54. {
  55. return pHead2;
  56. }
  57. if (pHead2 == NULL)
  58. {
  59. return pHead1;
  60. }
  61. ListNode* pMerge = NULL;
  62. //2.递归思路,
  63. if (pHead1->m_nValue < pHead2->m_nValue)
  64. {//选取数值小的首节点为合并后的首节点
  65. pMerge = pHead1;
  66. pMerge->m_pNext = Merge_list(pHead1->m_pNext, pHead2); //对余下部分进行递推
  67. }
  68. else
  69. {
  70. pMerge = pHead2;
  71. pMerge->m_pNext = Merge_list(pHead1, pHead2->m_pNext);
  72. }
  73. //返回首节点指针
  74. return pMerge;
  75. }
  76. //功能:打印链表所有节点
  77. //输入:pHead 头节点地址
  78. //返回:无
  79. void Print_list_node(ListNode* pHead)
  80. {
  81. if (pHead != NULL)
  82. {
  83. while (pHead->m_pNext != NULL)
  84. {
  85. cout << pHead->m_nValue << ","; //打印节点信息
  86. pHead = pHead->m_pNext;
  87. }
  88. cout << pHead->m_nValue << endl; //打印尾节点
  89. }
  90. }

 

4 运行结果

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/98791683

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。