【简单】21. 合并两个有序链表(递归)

看到简单题我重拳出击!

题目

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

示例 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 均按 非递减顺序 排列

解题

func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {

    if list1==nil{
        return list2
    } else if list2==nil{
        return list1
    }

    var result,node *ListNode

    if list1.Val <= list2.Val{
        result = list1
        list1 = list1.Next
    } else {
        result = list2
        list2 = list2.Next
    }

    node = result

    for{
        if list1==nil || list2==nil{
            break
        }
        if list1.Val <= list2.Val{
            node.Next = list1
            list1 = list1.Next
        } else {
            node.Next = list2
            list2 = list2.Next
        }
        node = node.Next
    }

    if list2==nil{
        node.Next = list1
    } else {
        node.Next = list2
    }

    return result

}

一如既往地墨迹,还差着呢

题解

方法一:迭代

func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
    dummy := &ListNode{}
    currentNode := dummy

    for list1!= nil && list2 != nil{
        if list1.Val <= list2.Val{
            currentNode.Next = list1
            list1 = list1.Next
        } else {
            currentNode.Next = list2
            list2 = list2.Next
        }
        currentNode = currentNode.Next
    }

    if list1 == nil{
        currentNode.Next = list2
    } else {
        currentNode.Next = list1
    }

    return dummy.Next

}

方法二:递归

func mergeTwoLists(list1, list2 *ListNode) *ListNode {
    if list1 == nil {
        return list2 // 注:如果都为空则返回空
    }
    if list2 == nil {
        return list1
    }
    if list1.Val < list2.Val {
        list1.Next = mergeTwoLists(list1.Next, list2)
        return list1
    }
    list2.Next = mergeTwoLists(list1, list2.Next)
    return list2
}

作者:灵茶山艾府
链接:https://leetcode.cn/problems/merge-two-sorted-lists/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

长进

  1. 创建一个哨兵节点,到时候直接return哨兵节点地Next节点,简化很多代码量
    • 不用单独处理头结点
    • 不用判空
  2. 哨兵节点的创建:dummy := &ListNode{}
  3. 判断没写到for循环单独写if,垃圾
  4. 递归法

你可能感兴趣的:(LeetCode刷题,链表,数据结构,leetcode)