算法--合并两个有序链表
有两种方法,迭代和递归。
迭代:
//不带头结点
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
算法--合并两个有序链表相关推荐
- [PHP] 算法-合并两个有序链表为一个有序链表的PHP实现
合并两个有序的链表为一个有序的链表: 类似归并排序中合并两个数组的部分 1.遍历链表1和链表2,比较链表1和2中的元素大小 2.如果链表1结点大于链表2的结点,该结点放入第三方链表 3.链表1往下走一 ...
- 算法----合并两个有序链表
题目: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] ...
- 【每日一算法】 合并两个有序链表
微信改版,加星标不迷路! 每日一算法-合并两个有序链表 作者:阿广 阅读目录 1 题目 2 解析 1 题目 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. ...
- java合并两个有序链表_JS实现的合并两个有序链表算法示例
本文实例讲述了JS实现的合并两个有序链表算法.分享给大家供大家参考,具体如下: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1-> ...
- 经典算法——合并两个有序单向链表
1.题目要求 这是一道求职面试时经常要求手写或者机试的经典题目. 已知两个链表 head1 和 head2 各自有序,请把它们合并成一个链表依然有序.结果链表要包含 head1 和head2 的所有节 ...
- 算法:合并两个有序链表
题目 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1- ...
- fastreport 打印两个list_Smaller And Smarter Python数据结构:合并两个有序链表
原创: 老表 简说Python 今日问题 :翻转链表k个相邻结点 """目标:写一段程序,合并两个有序链表例如:输入-> 1->2->3输入-> ...
- python合并两个有序列表_Python实现合并两个有序链表的方法示例
本文实例讲述了Python实现合并两个有序链表的方法.分享给大家供大家参考,具体如下: 思路:先选出第一个节点,然后遍历两个链表,把小的作为当前节点的下一个节点,一直到其中一个链表遍历完,这时候把另一 ...
- leetcode 21 java_LeetCode 21. 合并两个有序链表
LeetCode 21. 合并两个有序链表 题目 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1-> ...
最新文章
- 深度学习项目代码阅读建议
- [zz]Ubuntu10.04源 更新源列表
- 1.模型 16个相机参数(内参、外参、畸变参数)
- 谈谈游戏开发中用到设计模式
- 野史杂谈,西游记令人崩溃的真相
- 【笔记】一些linux实用函数技巧【原创】
- SQL数据库高级查询命令(3)
- Java消息中间件--JMS规范
- linux epoll用法之二
- 如何获取PHP中的当前日期和时间?
- redistemplate 设置永不过期_解决密码已过期,拒绝访问问题
- 【控制】《最优控制理论与系统》-胡寿松老师-目录
- 【机器学习】解释机器学习模型
- python 手机号码_Python手机号码归属地查询代码
- Ubutu Mosquitto部署和相关的配置(支持websocket)
- Oracle 中数据类型变更无效 ---ora-22858:数据类型的变更无效 for clod
- BZOJ 1023 仙人掌图
- Photoshop 油画效果
- 来自CSDN的精华网址
- 接口压力测试:Siege压测安装、使用和说明