[LeetCode][golang] 21. 合并两个有序链表

725 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述:

21. 合并两个有序链表

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

示例 1:

image.png

输入: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 均按 非递减顺序 排列

思路分析:

比较两个链表的结点,比如 A 有 3 个结点,B 有 3 个 结点。
A 的第一个结点比 B 的第一结点小,就把 A 的第一个结点加到结果链表中,后面再让 A 的第二个结点和 B 的第一个结点比较,小的再加到结果链表中。

  1. 定义一个链表节点。

  2. 对于两个有序链表进行无限循环。

    1. 两个链表的当前节点都是空,则跳出循环。

    2. 定义一个链表节点的内部变量。

      比较两个链表节点的当前值,小的值的节点保存到内部变量,然后对应链表的当前节点指向下一个节点。
      如果其中的一个链表的当前节点没有值,则另一个有值的当前节点保存到内部变量。

    3. 内部变量中保存的节点添加到 1 中定义的链表节点的下一个节点。

    4. 1 中定义的链表节点的当前节点指向下一个节点。

AC 代码:

golang :

// 21. 合并两个有序链表
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
   var list ListNode
   tmp := &list
   tmp1 := list1
   tmp2 := list2
   for {
      if tmp1 == nil && tmp2 == nil {
         break
      }

      var node *ListNode
      if tmp1 != nil && tmp2 != nil {
         if tmp1.Val < tmp2.Val {
            node = tmp1
            // 链表1指向下一个节点
            tmp1 = tmp1.Next
         } else {
            node = tmp2
            // 链表2指向下一个节点
            tmp2 = tmp2.Next
         }
      } else if tmp1 != nil {
         node = tmp1
         // 链表1指向下一个节点
         tmp1 = tmp1.Next
      } else if tmp2 != nil {
         node = tmp2
         // 链表2指向下一个节点
         tmp2 = tmp2.Next
      }

      // 保存值较小的节点
      tmp.Next = node
      // 指向下一个节点
      tmp = node
   }

   return list.Next
}

总结:

毕业之后好像没写过链表,居然有些不会写了。
该问题比较简单,主要是两个链表中的某个元素添加到结果链表中后,对应链表的当前节点要指向下一个节点,结果链表中的当前节点也要指向下一个节点。