/
// 7. 题目17 合并两个排序链表
//时间复杂度:O(n), 空间复杂度:O(1)

ListNode<int>* MergeSortedLists(ListNode<int>* plhsHead, ListNode<int>* prhsHead)
{if (NULL == plhsHead){return prhsHead;}if (NULL == prhsHead){return plhsHead;}ListNode<int>* pMergeHead = NULL;if (plhsHead->m_stData < prhsHead->m_stData){pMergeHead = plhsHead;pMergeHead->m_pNextNode = MergeSortedLists(plhsHead->m_pNextNode, prhsHead);}else{pMergeHead = prhsHead;pMergeHead->m_pNextNode = MergeSortedLists(plhsHead, prhsHead->m_pNextNode);}return pMergeHead;
}// 非递归方法:合并两个有序链表
//时间复杂度:O(n), 时间复杂度(1)
ListNode<int>* MergeSortedLists_1(ListNode<int>* pHead1, ListNode<int>* pHead2)
{if (NULL == pHead1){return pHead2;}if (NULL == pHead2){return pHead1;}// 1.新链表头结点ListNode<int>* pMergeHead = NULL;if (pHead1->m_stData <= pHead2->m_stData){pMergeHead = pHead1;pHead1 = pHead1->m_pNextNode;}else{pMergeHead = pHead2;pHead2 = pHead2->m_pNextNode;}ListNode<int>* pTmpNode = pMergeHead;// 2.比较两个链表,较小的节点加入新链表后面while (pHead1 && pHead2){if (pHead1->m_stData <= pHead2->m_stData){pTmpNode = pHead1;pHead1 = pHead1->m_pNextNode;}else{pTmpNode = pHead2;pHead2 = pHead2->m_pNextNode;}// 不能让新链表中断!!!!if (NULL != pTmpNode->m_pNextNode){pTmpNode = pTmpNode->m_pNextNode;}}// 3.链接剩余的元素if (pHead1 && pTmpNode){pTmpNode->m_pNextNode = pHead1;}if (pHead2 && pTmpNode){pTmpNode->m_pNextNode = pHead2;}return pMergeHead;
}void MergeSortedListsTestFunc()
{cout << "\n\n --------------- MergeSortedListsTestFunc Start -------------->" << endl;// 初始化链表1int aiArray[] = {1, 2, 3, 4, 5, 6, 7, 8};int iLen = sizeof(aiArray) / sizeof(int);TRAVERSAL_ARRAY(aiArray, iLen);CSingleList<int>* pList = new CSingleList<int>();if (!pList){return;}for (int i = 0; i < iLen; i++){pList->Insert(aiArray[i]);}pList->Traversal();// 初始化链表2int aiArray2[] = {9, 10, 11, 12, 13, 14, 15};int iLen2 = sizeof(aiArray2) / sizeof(int);TRAVERSAL_ARRAY(aiArray2, iLen2);CSingleList<int>* pList2 = new CSingleList<int>();if (!pList2){SAVE_DELETE(pList);return;}for (int i = 0; i < iLen2; i++){pList2->Insert(aiArray2[i]);}pList2->Traversal();ListNode<int>* pHead1 = pList->GetHeadNode();ListNode<int>* pHead2 = pList2->GetHeadNode();// 合并链表//ListNode<int>* pMergeNode = MergeSortedLists(pHead1, pHead2);//if (pMergeNode)//{//    cout << "两个有序链表合并后: " << endl;//    TraversalList(pMergeNode);//}//cout << "合并后原来链表值: " << endl;//pList->Traversal();//pList2->Traversal();
    ListNode<int>* pMergeNode = MergeSortedLists_1(pHead1, pHead2);if (pMergeNode){cout << "两个有序链表合并后: " << endl;TraversalList(pMergeNode);}// 释放内存
    SAVE_DELETE(pList);// list 与 pList2 已经合并在一起,不用重复释放pLIst2!!!!//SAVE_DELETE(pList2);
cout << "\n\n --------------- MergeSortedListsTestFunc End -------------->" << endl;}

转载于:https://www.cnblogs.com/yzdai/p/11258705.html

题目17 合并两个排序链表相关推荐

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

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

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

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 常考题: 假设两个链表如下: 链表1:   1  ->  3 -> 5 -> ...

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

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

  4. 17.合并两个排序的链表

    当代码试图訪问空指针指向的内存时程序就会崩溃,从而导致鲁棒性问题.所以要对空链表单独处理. ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { ...

  5. 面试 14:合并两个排序链表

    终于又回到了我们的算法习题讲解了.南尘发现最近文章阅读量明显比以前少了不少,就上门请教小伙伴原因.他们都说作为一名 Android 应用开发工程师,实在是在工作中没有接触到算法.做技术这个东西,学习了 ...

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

    题目:合并两个排序的链表 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: 输入:1->2->4, 1->3->4 输出:1->1-& ...

  7. 合并两个排序的链表递归和非递归C++实现

    题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,要求合成后的链表满足单调不减规则. 1.分析 已知输入的两个链表递增有序,要使输出的链表依然递增有序,可以依次从输入的两个链表中挑选最小的 ...

  8. 剑指Offer面试题:16.合并两个排序的链表

    PS:这也是一道出镜率极高的面试题,我相信很多童鞋都会很眼熟,就像于千万人之中遇见不期而遇的人,没有别的话可说,唯有轻轻地问一声:"哦,原来你也在这里? " 一.题目:合并两个排序 ...

  9. LeetCode实战:合并K个排序链表

    题目英文 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexi ...

最新文章

  1. python repl_asyncio REPL(Python 3.8)
  2. 初学linux系统代码,linux初学者-系统日志(二)(示例代码)
  3. npm 安装less插件_node+npm+webpack+less安装
  4. 华为鸿蒙OS用户今年底或达2亿 将发布自研鸿蒙编程语言
  5. 罗翔 ---- 理想主义的花
  6. 科大讯飞2017年报:营收54亿利润5.9亿,政府补助1.18亿
  7. 2010年一月份兑换公告
  8. 基于RGB图像的草莓叶片白粉病检测深度学习方法
  9. BZOJ2809:[Apio2012]dispatching——题解
  10. 阿里矢量图标库的使用方法
  11. Java实现端口扫描器
  12. en55032最新标准下载_欧盟CE认证EN55032标准
  13. [转]DOS批处理高级教程精选合编
  14. 自学微信小程序开发第六天- TODOS案例
  15. 如何用PS把照片变成红/白/蓝底
  16. 鸿蒙2.0正式开源,华为重磅押注开发者生态
  17. 小米6线刷兼救砖_解账户锁_纯净刷机包_教程
  18. ERROR: Rosdep experienced an error: Unable to handle package.xml format version ‘3‘
  19. 程序员不得不学的操作系统知识(二)
  20. 下载并安装windows版本的Redis

热门文章

  1. python 对字典按照value进行排序
  2. math_二重积分/多元函数奇偶性
  3. php web程序打包成exe,将PHP脚本转换为独立的windows可执行文件
  4. python的魔法_python的各种魔法方法,多种,魔术
  5. 20年研发管理经验谈(八)
  6. 3、switch 语句-项目1-投票表决器
  7. 内网渗透系列:内网渗透思路整理
  8. flowlayout java_Java图形化界面设计——布局管理器之FlowLayout(流式布局)
  9. 电容为什么会爆炸?电容爆炸的原因
  10. Xmind 2021快捷键