LeetCode《初级算法》链表之和并两个有序链表 -- JavaScript

430 阅读1分钟

题目

题目链接:leetcode-cn.com/leetbook/re…

image.png


题解


顺序遍历,逐个比较

遍历两条有序链表,比较两条链表的第一个节点的值谁小; 创建一个空的节点(还是有头节点的链表好操作,不用专门考虑第一个节点的处理),将较小值的节点挂载到以创建的空节点为头节点的链表上; 当两条链表中某条链表为空时,将另一条链表直接挂载到以创建的空节点为头节点的链表上;

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists = function(l1, l2) {
    let head = new ListNode(null,null);
    let temp = head;

    while(l1 !== null && l2 !== null) {

        if(l1.val <= l2.val) {
            temp.next = l1;
            temp = l1;
            l1 = l1.next;
        }else {
            temp.next = l2;
            temp = l2;
            l2 = l2.next;
        }
    }

    if(l1 !== null) {
        temp.next = l1; 
    }

    if(l2 !== null) {
        temp.next = l2;
    }

    return head.next;


};

2、递归实现

递归有时候总会把你绕晕,这个时候结合实例推演一遍能更好的理清算法;

image.png

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists = function(l1, l2) {
    
    if(l1 === null){

        return l2;
    }else if(l2 === null) {
        return l1;
    }

    let newHead = null;
    if(l1.val <= l2.val) {

        newHead = mergeTwoLists(l1.next,l2);
        // 当递归回溯到这里时,l1.val 和 l2.val 中较大值的节点已经在更深层的递归中被连接到了新链表中,
        // 接下来将 较小值的节点充当新链表的第一个节点,然后返回新链表就行了
        l1.next = newHead;
        newHead = l1;
        
    }else {
        newHead = mergeTwoLists(l1,l2.next);
        // 同上
        l2.next = newHead;
        newHead = l2;
    }

    
    return newHead;
};

大家如果有更好的思路和解法,欢迎大家一起来讨论啊~


这是使用 JavaScript 对 LeetCode《初级算法》的每道题的总结和实现的其中一篇,汇总篇在这里:

juejin.cn/post/700669…