LeetCode: 21.合并两个有序链表|刷题打卡

222 阅读1分钟

一、题目描述

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

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

二、思路分析

两个升序的链表,自然而然的就能想到去比较它门链头的值,然后依次获取当前最小的节点组成一个新的的链表。

使用双指针变量两个升序链表,初始的时候指针 1 指向链表的表头,指针 2 指向链表 2 的表头。
然后判断它们的值,假如指针 1 的值小于或等于指针 2 的值,那么就把指针 1 的取出放到新的链表的 next 中,指针 1 指向当前节点的 next。
然后开始新的一轮比较,直到其中一个的 next 为 null ,那么就把剩下的那个链表直接添加到新的链表并返回当中即可。
如果两个链表的 next 都为 null 了,那么直接返回新的链表即可。

三、AC 代码

方法 1: 迭代版

var mergeTwoLists = function(l1, l2) {
    const head = new ListNode()
    let p = head
    
    while(l1 && l2) {
        if(l1.val <= l2.val) {
            p.next = l1
            l1 = l1.next
        } else {
            p.next = l2
            l2 = l2.next
        }

        p = p.next
    }

    if(l1) p.next = l1
    else p.next = l2

    return head.next
}

方法 2: 递归版

var mergeTwoLists = function(l1, l2) {
    const head = new ListNode()
    let p = head
    
    const callback = (p1, p2) => {
        if(p1 && p2) {
            if(p1.val <= p2.val) {
                p.next = p1
                p1 = p1.next
            } else {
                p.next = p2
                p2 = p2.next
            }

            p = p.next
            callback(p1, p2)
        } else if(p1) {
            p.next = p1
        } else {
            p.next = p2
        }
    }

    callback(l1, l2)

    return head.next
}

四、总结

主要就是链表的遍历和了解链表的数据结构和升序排序的特点。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情