有两种方法,迭代和递归。

迭代:

//不带头结点
Node * Merge(Node *head1 , Node *head2){//判空if ( head1 == NULL)return head2 ;if ( head2 == NULL)return head1 ;//头结点Node *head = NULL ;//分别指向两个链表Node *p1 = NULL;Node *p2 = NULL;//head指向较小值的那个链表if ( head1->data < head2->data ){head = head1 ;p1 = head1->next;p2 = head2 ;}else{head = head2 ;p2 = head2->next ;p1 = head1 ;}//当前排序好的链表的末尾节点Node *pcurrent = head ;while ( p1 != NULL && p2 != NULL){if ( p1->data <= p2->data ){pcurrent->next = p1 ;pcurrent = p1 ;p1 = p1->next ;}else{pcurrent->next = p2 ;pcurrent = p2 ;p2 = p2->next ;}}//还有一方没有遍历完的情况if ( p1 != NULL )pcurrent->next = p1 ;if ( p2 != NULL )pcurrent->next = p2 ;return head ;
}

时间复杂度:O(n+m),m和n分别为两个链表的长度,因为两个链表都要遍历到

空间复杂度:O(1)

递归:

Node * MergeRecursive(Node *head1 , Node *head2){//判空if ( head1 == NULL )return head2 ;if ( head2 == NULL)return head1 ;Node *head = NULL ;if ( head1->data < head2->data ){head = head1 ;//每次递归都返回head->next,head表示当前节点,一个局部变量head->next = MergeRecursive(head1->next,head2);}else{head = head2 ;head->next = MergeRecursive(head1,head2->next);}return head ;
}

时间复杂度:O(n+m),每个节点都要遍历到

空间复杂度:O(n+m),递归需要消耗栈空间,大小就是m+n

力扣的迭代代码更为简洁

ListNode* mergeTwoLists(ListNode *a, ListNode *b) {if ((!a) || (!b)) return a ? a : b;ListNode head, *tail = &head, *aPtr = a, *bPtr = b;while (aPtr && bPtr) {if (aPtr->val < bPtr->val) {tail->next = aPtr; aPtr = aPtr->next;} else {tail->next = bPtr; bPtr = bPtr->next;}tail = tail->next;}tail->next = (aPtr ? aPtr : bPtr);return head.next;
}

代码地址:https://www.cnblogs.com/fangyukuan/archive/2010/09/18/1829871.html

算法--合并两个有序链表相关推荐

  1. [PHP] 算法-合并两个有序链表为一个有序链表的PHP实现

    合并两个有序的链表为一个有序的链表: 类似归并排序中合并两个数组的部分 1.遍历链表1和链表2,比较链表1和2中的元素大小 2.如果链表1结点大于链表2的结点,该结点放入第三方链表 3.链表1往下走一 ...

  2. 算法----合并两个有序链表

    题目: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] ...

  3. 【每日一算法】 合并两个有序链表

    微信改版,加星标不迷路! 每日一算法-合并两个有序链表 作者:阿广 阅读目录 1 题目 2 解析 1 题目 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. ...

  4. java合并两个有序链表_JS实现的合并两个有序链表算法示例

    本文实例讲述了JS实现的合并两个有序链表算法.分享给大家供大家参考,具体如下: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1-> ...

  5. 经典算法——合并两个有序单向链表

    1.题目要求 这是一道求职面试时经常要求手写或者机试的经典题目. 已知两个链表 head1 和 head2 各自有序,请把它们合并成一个链表依然有序.结果链表要包含 head1 和head2 的所有节 ...

  6. 算法:合并两个有序链表

    题目 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1- ...

  7. fastreport 打印两个list_Smaller And Smarter Python数据结构:合并两个有序链表

    原创: 老表 简说Python 今日问题 :翻转链表k个相邻结点 """目标:写一段程序,合并两个有序链表例如:输入-> 1->2->3输入-> ...

  8. python合并两个有序列表_Python实现合并两个有序链表的方法示例

    本文实例讲述了Python实现合并两个有序链表的方法.分享给大家供大家参考,具体如下: 思路:先选出第一个节点,然后遍历两个链表,把小的作为当前节点的下一个节点,一直到其中一个链表遍历完,这时候把另一 ...

  9. leetcode 21 java_LeetCode 21. 合并两个有序链表

    LeetCode 21. 合并两个有序链表 题目 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1-> ...

最新文章

  1. 深度学习项目代码阅读建议
  2. [zz]Ubuntu10.04源 更新源列表
  3. 1.模型 16个相机参数(内参、外参、畸变参数)
  4. 谈谈游戏开发中用到设计模式
  5. 野史杂谈,西游记令人崩溃的真相
  6. 【笔记】一些linux实用函数技巧【原创】
  7. SQL数据库高级查询命令(3)
  8. Java消息中间件--JMS规范
  9. linux epoll用法之二
  10. 如何获取PHP中的当前日期和时间?
  11. redistemplate 设置永不过期_解决密码已过期,拒绝访问问题
  12. 【控制】《最优控制理论与系统》-胡寿松老师-目录
  13. 【机器学习】解释机器学习模型
  14. python 手机号码_Python手机号码归属地查询代码
  15. Ubutu Mosquitto部署和相关的配置(支持websocket)
  16. Oracle 中数据类型变更无效 ---ora-22858:数据类型的变更无效 for clod
  17. BZOJ 1023 仙人掌图
  18. Photoshop 油画效果
  19. 来自CSDN的精华网址
  20. 接口压力测试:Siege压测安装、使用和说明

热门文章

  1. BZOJ4031: [HEOI2015]小Z的房间
  2. guava入门学习2(新集合)
  3. C#中父子窗口之间实现控件互操作
  4. 一种比较兼容的Excel报表导出方法
  5. API设计中防重放攻击
  6. Unity3d 布娃娃系统
  7. linux中添加PHP的mongoDB支持扩展
  8. hihocoder 1249(2015ACM/ICPC北京)
  9. CentOS6.5+puppet3.7.3 安装、配置及测试
  10. 【C++基础】++i和i++