合并两个有序链表 2022-02-23 周三

题目

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

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

思路

链表的问题用while循环比较好,比较直观。用递归也是可以啊,不过感觉更难理解。
大神的演示

  • 准备1:判空。这个判空很有意思,只要有一个为空,就直接返回另一个,都不需要合并。

  • 准备2:引入3个可移动的辅助指针;传入参数list1和list2,以及合并后的链表头指针最好都不要修改。

  • 步骤1:确定头指针;现在list1和list2都不为空了,谁的值小,谁就是合并后的头指针。

这步也容易忽略

  • 步骤2:while循环,条件是两个链表都不为空,谁小,就把谁接上;然后指针逐步后移一位;

  • 步骤3:退出while循环之后,有一个为空了,把剩下那个不为空的接上就完事了。

这步容易漏掉

  • 步骤4:返回合并后的头指针,虽然这个指针基本啥也没干,就只是存了指针值。

C代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    // 判空
    if (list1 == NULL) {
        return list2;
    }
    if (list2 == NULL) {
        return list1;
    }

    // 引入两个辅助指针,list1和list2保持不动
    struct ListNode *current1 = list1;
    struct ListNode *current2 = list2;

    // 合并后的表头指针
    struct ListNode *mergeList = NULL;

    // 确定头指针,比较,谁小谁就是头
    if (current1->val < current2->val) {
        mergeList = current1;
        current1 = current1->next;
    } else {
        mergeList = current2;
        current2 = current2->next;
    }

    // 头指针保持不动,引入辅助进行移动操作
    struct ListNode *mergeCurrent = mergeList;

    // 两个链表不为空,才需要比较
    while((current1 != NULL) && (current2 != NULL)) {
        // 比较,谁小就接谁
        if (current1->val < current2->val) {
            mergeCurrent->next = current1;
            current1 = current1->next;
        } else {
            mergeCurrent->next = current2;
            current2 = current2->next;
        }
        // 往后挪一位
        mergeCurrent = mergeCurrent->next;
    }

    // 接上剩余的
    mergeCurrent->next = (current1 != NULL) ? current1 : current2;

    // 返回合并后的指针
    return mergeList;
}

C代码

JS代码

/**
 * 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) {
    // 判空
    if (list1 == null) {
        return list2;
    }
    if (list2 == null) {
        return list1;
    }

    // 头节点
    let current1 = list1;
    let current2 = list2;
    let mergeList = null;

    if (list1.val < list2.val) {
        mergeList = current1;
        current1 = current1.next;
    } else {
        mergeList = current2;
        current2 = current2.next;
    }

    // 比较大小,合并
    let mergeCurrent = mergeList;
    while((current1 != null) && (current2 != null)) {
        if (current1.val < current2.val) {
            mergeCurrent.next = current1;
            current1 = current1.next;
        } else {
            mergeCurrent.next = current2;
            current2 = current2.next;
        }
        mergeCurrent = mergeCurrent.next;
    }

    // 接上剩余的
    mergeCurrent.next = (current1 != null) ? current1 : current2;

    // 返回合并后的指针
    return mergeList;
};

JS代码

性能

性能表现

C比JS快很多啊

你可能感兴趣的:(合并两个有序链表 2022-02-23 周三)