LeetCode 75 突破:合并两个有序链表

92 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

LeetCode 75 学习计划适用于想为技术面试做准备但不确定应该聚焦于哪些题目的用户。学习计划中的题目都是经过精心挑选的,Level 1和 Level 2 学习计划是为初级用户和中级用户准备的,题目覆盖了大多数中层公司面试时所必需的数据结构和算法,Level 3 学习计划则是为准备面试顶级公司的用户准备的。来源

第 3 天

合并两个有序链表

难度:简单

题目

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

image.png

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

输入:l1 = [], l2 = []
输出:[]

输入:l1 = [], l2 = [0]
输出:[0]

解答

纳尼,这题难道就是合并数组,然后排序吗?

当然不是,数据结构是链表,并不是数组。

看代码注释中的说明,ListNode 是这样的结构,它有两个属性,val 和 next,分别表示是它的值,以及下一个指针指向哪?

/**
 * 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) {
    //...
};

题目给的两个链表都是有序的,这个条件要利用。

var mergeTwoLists = function(list1, list2) {
        if (l1 == null) { // 如果 l1 是空链表,直接返回 l2;
            return l2;
        }
        else if (l2 == null) { // 如果 l2 是空链表,直接返回 l1;
            return l1;
        }
        else if (l1.val < l2.val) { // 如果 l1 的值小于 l2 的值,l1 的指针则指向 l1 的下一个值,和 l2 再求有序链;
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        }
        else { // 与上同理
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }
};

总结

惊!递归还可以这么用!

递归的核心在于,我只关注我这一层要干什么,返回什么,至于我的下一层,不管。