LeetCode 75 ——21. 合并两个有序链表 (Go实现)

112 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

LeetCode 75 ——21. 合并两个有序链表 (Go实现)

一、题目描述:

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:

image-20221001095711881

输入: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)

链接:leetcode.cn/problems/me…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    这道题目是简单的有序链表合并问题,我的思路是从两个链表头开始比较各节点的Val值大小,选取小的接入我们创建的ListNode,直到list1或list2遍历完成,之后我们就可以将另一条链表剩余部分直接接入我们创建的ListNode。

    这里需要注意的是,由于我们创建的ListNode在使用过程中指针会移动,所以我们需要保存头节点的地址,以便我们不会丢失链表的头节点位置。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    不是,刚开始没有保存头节点head,而是直接使用merge,一直Next,导致头节点坐标丢失,最后return只有最后一个节点加上某条链表剩余部分的值,后来仔细阅读代码,发现了这一问题。

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    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)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    递归方法我们来模拟一下:

image.png

三、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)。

模板来源:

作者:掘金酱

链接:juejin.cn/post/706970…

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。