题目
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入: 1->2->4, 1->3->4
输出: 1->1->2->3->4->4
限制:
0 <= 链表长度 <= 1000
注意:本题与主站 21 题相同:leetcode-cn.com/problems/me…
题解
由题可知,链表l1和l2是有序递增的,可以容易想到使用双指针的思路,使用p1指针和p2指针分别指向l1和l2, 根据l1.val和l2.val的大小确定节点的添加顺序,p1和p2交替前进,直至遍历完毕
引入哑结点dummy, 由于初始状态合并链表中无节点,因此循环第一轮时无法将节点添加到合并链表中,所以初始化一个哑结点作为合并链表的伪头结点,将每个节点添加到dummy之后
具体流程:
- 当
l1或者l2为空时,跳出循环 - 循环:
- 当
l1.val < l2.val,p的next指向l1,p1向前走一步 - 当
l1.val >= l2.val,p的next指向l2,p2向前走一步 p向前走一步,p = p.next
- 当
- 合并剩余节点
l1为空,将l2添加到p之后l2为空,将l1添加到p之后
- 合并链表在
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;
};