持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
LeetCode 75 ——21. 合并两个有序链表 (Go实现)
一、题目描述:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 示例 2:
输入:l1 = [], l2 = [] 输出:[] 示例 3:
输入:l1 = [], l2 = [0] 输出:[0]
提示:
两个链表的节点数目范围是 [0, 50] -100 <= Node.val <= 100 l1 和 l2 均按 非递减顺序 排列
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
-
这道题考察了什么思想?你的思路是什么?
这道题目是简单的有序链表合并问题,我的思路是从两个链表头开始比较各节点的Val值大小,选取小的接入我们创建的ListNode,直到list1或list2遍历完成,之后我们就可以将另一条链表剩余部分直接接入我们创建的ListNode。
这里需要注意的是,由于我们创建的ListNode在使用过程中指针会移动,所以我们需要保存头节点的地址,以便我们不会丢失链表的头节点位置。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
不是,刚开始没有保存头节点head,而是直接使用merge,一直Next,导致头节点坐标丢失,最后return只有最后一个节点加上某条链表剩余部分的值,后来仔细阅读代码,发现了这一问题。
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode { if list1 == nil { return list2 } else if list2 == nil { return list1 } else if list1.Val < list2.Val { list1.Next = mergeTwoLists(list1.Next, list2) return list1 } else { list2.Next = mergeTwoLists(list1, list2.Next) return list2 } } 作者:liansy 链接:https://leetcode.cn/problems/merge-two-sorted-lists/solution/die-dai-di-gui-goyu-yan-shi-xian-by-lian-bkly/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。递归方法我们来模拟一下:
三、AC 代码:
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
var head *ListNode = new(ListNode)
merge := head
for list1 != nil && list2 != nil{
if list1.Val <= list2.Val {
merge.Next = list1
list1 = list1.Next
}else{
merge.Next = list2
list2 = list2.Next
}
merge = merge.Next
}
if list1 == nil {
merge.Next = list2
}
if (list2 == nil){
merge.Next = list1
}
return head.Next
}
四、总结:
这道题可以使用递归和迭代的方法,递归的时间复杂度是O(n+m)、空间复杂度也是O(n+m),迭代的空间复杂度是O(n+m)、空间复杂度是O(1)。
模板来源:
作者:掘金酱
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。