剑指 Offer 25. 合并两个排序的链表

87 阅读1分钟

题目

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

示例1:

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

限制:

0 <= 链表长度 <= 1000

注意:本题与主站 21 题相同:leetcode-cn.com/problems/me…

题解

由题可知,链表l1l2是有序递增的,可以容易想到使用双指针的思路,使用p1指针和p2指针分别指向l1l2, 根据l1.vall2.val的大小确定节点的添加顺序,p1p2交替前进,直至遍历完毕

引入哑结点dummy, 由于初始状态合并链表中无节点,因此循环第一轮时无法将节点添加到合并链表中,所以初始化一个哑结点作为合并链表的伪头结点,将每个节点添加到dummy之后

具体流程:

  1. l1或者l2为空时,跳出循环
  2. 循环:
    • l1.val < l2.val, pnext指向 l1, p1向前走一步
    • l1.val >= l2.val, pnext指向 l2, p2向前走一步
    • p向前走一步, p = p.next
  3. 合并剩余节点
    • l1为空,将l2添加到 p之后
    • l2为空,将l1添加到 p之后
  4. 合并链表在dummy之后,返回dummy.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) {
    let  p1 = l1, p2 = l2;
    let  dummy = new ListNode(-1);
    let  p = dummy;

    while(p1 != null && p2 != null) {
        if (p1.val < p2.val) {
            p.next = p1;
            p1 = p1.next;
        } else {
            p.next = p2;
            p2 = p2.next;
        }
        p = p.next;
    }

    if (p1 == null) {
        p.next = p2;
    } else if (p2 == null) {
        p.next = p1;
    }

    return dummy.next;

};

原题链接

剑指 Offer 25. 合并两个排序的链表