刷题标记
- 第一遍
- 第二遍
- 第三遍
- 第四遍
- 第五遍
求解过程
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/merge-two-sorted-lists 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
编写
public ListNode mergeTwoLists(ListNode l1, ListNode l2)
函数
思路
合并有序线性表 L1、L2,有一个通用的思路,如下
- 初始化每个表的遍历指针 Lp1,Lp2;并且新建一个线性表 L3,存储结果。
- 循环比较,将较小元素放入 L3
- 如果 L1 还有元素未遍历,处理 L1 剩余元素
- 处理 L2 剩余元素未遍历,处理 L2 剩余元素
Java 实现
1 | /** |
- 时间复杂度为 \(O(n+m)\)
- 空间复杂度为 \(O(1)\)
高手方案
思路:递归
高手还另外提供了一种递归思路:
- 两个链表头部较小的一个与剩下元素的
merge
操作结果合并
Java 实现
1 | public ListNode mergeTwoLists(ListNode l1, ListNode l2) { |
- 时间复杂度为 \(O(n+m)\)
- 空间复杂度为 \(O(n+m)\) :最多消耗 n+m 层栈空间
类似题:88.merge-sorted-array
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 示例:
输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/merge-sorted-array 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
刷题标记
- 第一遍
- 第二遍
- 第三遍
- 第四遍
- 第五遍
Java 实现
1 | public void merge(int[] nums1, int m, int[] nums2, int n) { |
- 时间复杂度为 \(O(n+m)\)
- 空间复杂度为 \(O(1)\)
高手方案
- 思路
- 从后往前遍历,将大的放到 nums1 的指定位置
- Java 实现
1 | // 作者:LeetCode |
- 时间复杂度为 \(O(n+m)\)
- 空间复杂度为 \(O(1)\)
总结
合并有序线性表 L1、L2,有一个通用的思路,如下
- 初始化每个表的遍历指针 Lp1,Lp2;并且新建一个线性表 L3,存储结果。
- 循环比较,将较小元素放入 L3
- 如果 L1 还有元素未遍历,处理 L1 剩余元素
- 处理 L2 剩余元素未遍历,处理 L2 剩余元素