[0021] 合并两个有序链表
- GitHub
- http://leetcode.xuezhisd.top/post/76deca13.html
- https://leetcode.com/problems/merge-two-sorted-lists
- https://leetcode-cn.com/problems/merge-two-sorted-lists
题目描述
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
Related Topics
题目解析
- 本题是一道模拟题
不确定性
方法一:顺序迭代法
分析
- 分别从l1和l2的第一个节点进行比较,将小的拿出来放在前面
- 若有其中一个链表的所有节点都被取完了,则将另一个链表中未被取出的所有的节点顺序添加到后面
思路
- 建立一个新的链表,使用指针t指向新链表的表头
- 使用l1和l2两个指针,遍历给出的链表
- 若l1所指向节点的值小于l2所指向节点的值,则将l1放在t所指向节点之后,反之则将l2放在t所指向节点之后
- 当l1和l2链表中有一个链表遍历完后,则将另一个链表的剩余节点都顺序添加到t所指向节点的后面
注意
知识点
- 链表的遍历
复杂度
- 时间复杂度 O(m+n),其中m为l1的长度,n为l2的长度
- 空间复杂度 O(1)
代码
1 | ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { |
方法二:递归法
分析
- 合并时每次的操作是一致的:将两个链表中最小的节点拿出来,再用相同的规则合并剩余的两个链表
思路
- 判断l1和l2所指向节点的值哪一个更小,然后递归地决定下一个添加到结果里的值
- 当递归完其中某一个链表时,则返回另一个链表剩余的节点
注意
- 边界情况的处理,当l1或l2为空链表时,则返回另一个链表剩余的节点
知识点
- 递归
复杂度
- 时间复杂度 O(m+n),其中m为l1的长度,n为l2的长度
- 空间复杂度 O(m+n),其中m为l1的长度,n为l2的长度
代码
1 | ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { |