橙子算法之如何进行链表合并
本文关键词如下:
链表
合并有序链表
合并两个有序链表
合并k个有序链表
递归
循环
本文涉及到的leetcode题目如下:
如何合并两个链表?
来一道leetcode原题
请大家先看一道原题:
相关思路
常见合并有序链表的办法有两种
- 通过循环遍历合并
- 通过递归合并
那么问题来了:
如何使用循环办法合并两个有序链表?
var mergeTwoLists = function(l1, l2) {
let dummyHead = new ListNode();
let cur = dummyHead;
while (l1 && l2) {
if (l1.val <= l2.val) {
cur.next = l1;
l1 = l1.next;
} else {
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
cur.next = l1 || l2;
return dummyHead.next;
};
如何用递归的办法合并两个有序链表?
var mergeTwoLists = function(l1, l2) {
if (!l1 || !l2) return l1 || l2;
if (l1.val <= l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
};
如何合并k个有序链表?
来一道leetcode原题
请大家先看一道原题: 合并k个排序列表
相关思路
接下来,我们来想一想,该如何合并k个有序链表,其实也好办,既然我们已经学会了如何合并两个有序链表,那我干脆一不做二不休,直接把k个有序链表直接两两合并不就完事了么(^▽^)
解法
var mergeKLists = function(lists) {
function mergeTwoLists (l1, l2) {/* 代码具体实现上方,任选其一即可 */}
// 排除边界情况
if(!lists || !lists.length) return null;
// 循环list,直到只剩一个链表
while (lists.length > 1) {
let p = lists.pop();
let q = lists.pop();
let ans = mergeTwoLists(p, q);
lists.push(ans);
}
return lists[0];
};
本文使用 mdnice 排版