合并两个有序链表

253 阅读1分钟

【题目】 合并两个有序链表

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

示例

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

解题

由于两个链表都是有序,可以使用双指针,交替判断,遍历两个链表,直到其中一个链表遍历完。

image.png

过程如上图所示,到第4步之后,两个链表就比较完了。

虚头结点+遍历

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists = function(l1, l2) {
    if (!l1) {
        return l2
    }
    if (!l2) {
        return l1;
    }
    // 利用虚头结点
    let cur = new ListNode(null), res = cur;
    while(true) {
        if (l1.val > l2.val) {
            cur.next = l2;
            l2 = l2.next;
        } else {
            cur.next = l1;
            l1 = l1.next;
        }
        cur = cur.next;
        if (!l1) {
            cur.next = l2;
            break;
        } else if (!l2) {
            cur.next = l1;
            break;
        }
    }
    return res.next;
};

递归

思路和上面是一样的,每次都是判断两个结点值的大小,只是上面需要新增一个头部结点,
采用递归时直接以头部结点数值小的那个结点作为头部结点。
    /**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists = function(l1, l2) {
    if (!l1) {
        return l2
    }
    if (!l2) {
        return l1;
    }
    if (l1.val > l2.val) {
        // 以l2头结点开始
        l2.next = mergeTwoLists(l1, l2.next); // 判断l2下个结点与l1当前结点哪个大
        return l2;
    } else {
        // 以l1头结点开始
        l1.next = mergeTwoLists(l1.next, l2); // 反过来判断l1下个结点与l2当前结点哪个大
        return l1;
    }
};