LeetCode 21 Merge Two Sorted Lists (Tag:Linked List Difficulty:Easy)

225 阅读2分钟

这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战

前言

关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!

题目描述

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

示例 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]

链接:leetcode-cn.com/problems/me…

题解

这道题是经典的链表合并题目。主要就是将两个有序数组合并为一个有序数组。链表题目我一般习惯于构造一个假的头部,这种方法往往能够通用化,而不必额外的考虑边界情况。

首先先构造一个新的头部 head, 然后我们循环比较 list1 和 list2 指针指向节点的数字的大小,如果 list1 指向的数字小,那么我们就将新头 head 的 next 指针指向 list1,否则指向 list2,这样就完成了一个节点的合并。然后更新 list1 / list2 的指针指向,更新头部指针的指向,继续比较。直到其中一个指针为空。

遍历到最后时,有可能存在一个链表遍历完了,另一个还没,所以我们最后要将新链表和没遍历完的链表链接起来。最后返回假头部的 next 节点,就是合并后的链表。

具体代码如下,时间复杂度为 O(m+n)

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} list1
 * @param {ListNode} list2
 * @return {ListNode}
 */
var mergeTwoLists = function(list1, list2) {
    // 构造一个假头部
    let head = new ListNode(0)
    let point = head
    while (list1 && list2) {
        if (list1.val < list2.val) {
            point.next = list1
            point = point.next
            list1 = list1.next
        } else {
            point.next = list2
            point = point.next
            list2 = list2.next
        }
    }
    
    if (list1) point.next = list1
    if (list2) point.next = list2
    return head.next   
};