【leet-code清晰解题思路💯✅】21. 合并两个有序链表

65 阅读1分钟

题目描述

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

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

解题思路

  • 合并两个有序链表,可以使用双指针的方法,不断取小的节点,尾插到答案链表里即可。复杂度O(n,1)
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
   head := &ListNode{}
   tail := head
   for list1 != nil && list2 != nil {
      if list1.Val < list2.Val {
         tail.Next = list1
         list1 = list1.Next
      } else {
         tail.Next = list2
         list2 = list2.Next
      }
      tail = tail.Next
   }
   if list1 != nil {
      tail.Next = list1
   }
   if list2 != nil {
      tail.Next = list2
   }
   return head.Next
}

image.png

  • 也可以递归,函数的返回值就是合并后的头节点。但是空间复杂度来到了O(n)
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
   if list1 == nil {
      return list2
   } else 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
}

image.png