LeetCode 21. Merge Two Sorted Lists & 88. Merge Sorted Array
合并两个有序链表
题目描述
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路
这道题可以使用递归实现,新链表也不需要构造新节点,我们下面列举递归三个要素
终止条件:两条链表分别名为l1
和l2
,当l1
为空或l2
为空时结束
返回值:每一层调用都返回排序好的链表头
本级递归内容:如果l1
的$val$值更小,则将l1->next
与排序好的链表头相接,l2
同理
$O(m+n)$,m
为l1
的长度,n
为l2
的长度
画解
- 作者:guanpengchn
- 链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/solution/hua-jie-suan-fa-21-he-bing-liang-ge-you-xu-lian-bi/
- 来源:力扣(LeetCode)
1 | struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){ |
合并两个有序数组
题目描述
给定两个有序整数数组 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]
思路
因为nums1
的空间都集中在后面,所以从后向前处理排序的数据会更好,节省空间,一边遍历一边将值填充进去
设置指针len1
和len2
分别指向nums1
和nums2
的有数字尾部,从尾部值开始比较遍历,同时设置指针len
指向nums1
的最末尾,每次遍历比较值大小之后,则进行填充
当len1 < 0
时遍历结束,此时nums2
中海油数据未拷贝完全,将其直接拷贝到nums1
的前面,最后得到结果数组
时间复杂度:$O(m+n)$
画解
1 | // 作者:guanpengchn |
赏
使用支付宝打赏
使用微信打赏
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏