题目:
You are given the heads of two sorted linked lists list1 and list2.
Merge the two lists in a one sorted list. The list should be made by splicing together the nodes of the first two lists.
Return the head of the merged linked list.
Example 1:
Input: list1 = [1,2,4], list2 = [1,3,4]
Output: [1,1,2,3,4,4]
和leetcode88很像;
单链表只能从前往后遍历
过滤器和双指针的思想;
建一个新的链表,返回
var mergeTwoLists = function(list1, list2) {
let dummy = new ListNode(-1); // 定义一个虚拟头节点
let p = dummy; // 定义一个指针 p,初始时指向虚拟头节点,这个不动,动dummy,这里还是-1,所以//返回的是p.next
let p1=list1;
let p2=list2;
while(p1!==null || p2!==null){
if(p2==null || (p1!==null && p1.val<p2.val)){
dummy.next=p1;
p1=p1.next;
}
else{
dummy.next=p2;
p2=p2.next;
}
dummy=dummy.next;
}
return p.next;
};
dummy 和p 一个用来保存头部,一个用来遍历,动谁都行
var mergeTwoLists = function(list1, list2) {
let dummy = new ListNode(-1); // 定义一个虚拟头节点
let p = dummy; // 定义一个指针 p,初始时指向虚拟头节点,这个不动,动dummy,这里还是-1,所以//返回的是p.next
let p1=list1;
let p2=list2;
while(p1!==null || p2!==null){
if(p2==null || (p1!==null && p1.val<p2.val)){
p.next=p1;
p1=p1.next;
}
else{
p.next=p2;
p2=p2.next;
}
p=p.next;
}
return dummy.next;
};
第二种写法:!!
var mergeTwoLists = function(l1, l2) {
let dummy = new ListNode(-1); // 定义一个虚拟头节点
let p = dummy; // 定义一个指针 p,初始时指向虚拟头节点
let p1 = l1; // 定义指针 p1,初始时指向链表 l1 的头节点
let p2 = l2; // 定义指针 p2,初始时指向链表 l2 的头节点
while (p1 && p2) { // 当 p1 和 p2 都不为 null 时
if (p1.val < p2.val) { // 比较 p1 和 p2 指向的节点的值
p.next = p1; // 将 p1 添加到新链表的尾部
p1 = p1.next; // 将 p1 指向下一个节点
} else {
p.next = p2; // 将 p2 添加到新链表的尾部
p2 = p2.next; // 将 p2 指向下一个节点
}
p = p.next; // 将 p 指向新链表的尾部
}
if (p1) { // 如果链表 l1 还有剩余节点
p.next = p1; // 将剩余节点添加到新链表的尾部
} else { // 如果链表 l2 还有剩余节点
p.next = p2; // 将剩余节点添加到新链表的尾部
}
return dummy.next; // 返回虚拟头节点的下一个节点,即新链表的头节点
};