全栈开发知识库

59.合并两个有序链表

题目

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

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

思路

循环遍历比较哪个节点大就添加,遍历到一个链表结束后,把剩下的链表都拼接上就可以了(因为每个链表都已经是有序的)

class Solution {
    fun mergeTwoLists(list1: ListNode?, list2: ListNode?): ListNode? {
        if (list1 == null) {
            return list2
        }
        if (list2 == null) {
            return list1
        }
        var list1Node = list1
        var list2Node = list2

        var result: ListNode? = null
        var current: ListNode? = null

        while (list1Node != null && list2Node != null) {

            if (list1Node.`val` < list2Node.`val`) {
                if (result == null) {
                    // 没初始化根节点
                    result = list1Node
                    current = list1Node
                    // list1Node继续走
                    list1Node = list1Node.next
                    continue
                }
                // 初始化根节点了
                current?.next = list1Node
                list1Node = list1Node.next
            } else {
                if (result == null) {
                    result = list2Node
                    current = list2Node
                    list2Node = list2Node.next
                    continue
                }
                current?.next = list2Node
                list2Node = list2Node.next
            }
            // 更新当前的链表位置
            current = current?.next
        }
        // 最后遍历完后,最多有一个链表有剩余,直接拼接上就好,因为这两个链表都已经是有序的了
        current?.next = list1Node ?: list2Node
        return result
    }

    class ListNode(var `val`: Int) {
        var value: Int = 0
        var next: ListNode? = null
    }
}

上面可以看到有一部分代码都是为了判断result是不是null单独处理的,其实可以不用这样。

可以默认把result = ListNode(0) // 什么值都可以。然后最后return的时候返回result.next 就可以了,这样就不用判断result是不是赋值了,可以让代码更简洁。

复杂度

  • 时间复杂度: O(m + n),每个节点恰好被访问一次
  • 空间复杂度: O(1),仅移动指针,不创建新节点


  • 邮箱 :charon.chui@gmail.com
  • Good Luck!
本页由 Markdown 自动渲染 · 共 628 篇笔记