1.递归
function ListNode(x){
this.val = x;
this.next = null;
}
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var mergeTwoLists = function(l1,l2){
var newNode = new ListNode(null);
if(l1 == null) return l2;
if(l2 == null) return l1;
if(l1 == null && l2 ==null) return null;
if(l1.val < l2.val){
newNode = l1;
newNode.next = mergeTwoLists(l1.next,l2);
}else{
newNode = l2;
newNode.next = mergeTwoLists(l1,l2.next);
}
return newNode;
}
2.数组+链表
- 创建一个数组,循环遍历两个链表,将每个节点的值头添加到数组中
- 按照从下到大的顺序对数组进行排序
- 使用数组中的第一个元素作为值新创建一个ListNode节点作为新链表的头节点
- 从第二个元素开始,循环遍历数组,创建节点并添加到新链表中
function ListNode(x){
this.val = x;
this.next = null;
}
function Merge(pHead1, pHead2)
{
// write code here
if(pHead1 === null) return pHead2;
if(pHead2 === null) return pHead1;
let arr = [];
while(pHead1) {
arr.push(pHead1.val);
pHead1 = pHead1.next;
}
while(pHead2) {
arr.push(pHead2.val);
pHead2 = pHead2.next;
}
arr.sort((a,b) => a - b);
let newHead = new ListNode(arr[0]);
let current = newHead;
for(let i = 1;i < arr.length;i++) {
current.next = new ListNode(arr[i]);
current = current.next;
}
return newHead;
}
module.exports = {
Merge : Merge
};
3.引入伪头节点
算法流程:
- 初始化: 伪头节点newHead ,节点 cur 指向newHead 。
- 循环合并: 当pHead1或pHead2为空时跳出;
当pHead1.val < pHead2.val时: cur的后继节点指定为pHead1,并且pHead1向后走一步next
当pHead1.val > pHead2.val:cur的后继节点指定为pHead2,并且pHead2向后走一步next
节点cur向后next一步,cur = cur.next - 合并剩余尾部: 跳出时有两种情况,即pHead1或pHead2为空
若pHead1不等于 nulll , 将pHead1添加至节点 curcur 之后;
否则: 将怕Head2添加至节点 curcur 之后。 - 返回值: 合并链表在伪头节点 dumdum 之后,因此返回 dum.nextdum.next 即可。
图片详情
function ListNode(x){
this.val = x;
this.next = null;
}
function Merge(pHead1, pHead2)
{
// write code here
if(!pHead1) return pHead2;
if(!pHead2) return pHead1;
let newHead = new ListNode(0);
let current = newHead;
while(pHead1 && pHead2) {
if(pHead1.val < pHead2.val) {
current.next = pHead1;
current = current.next;
pHead1 = pHead1.next;
} else {
current.next = pHead2;
current = current.next;
pHead2 = pHead2.next;
}
}
if(pHead1 === null) {
current.next = pHead2;
} else {
current.next = pHead1;
}
return newHead.next;
}
module.exports = {
Merge : Merge
};