「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」
在做合并K个升序链表的困难题目前,我们先来看一个简单的合并两个有序链表题目
题目1:21. 合并两个有序链表
解答
var mergeTwoLists = function (l1, l2) {
let dummyHead = new ListNode(-1);
let m1 = l1;
let m2 = l2;
let cur = dummyHead;
while (m1 && m2) {
// 将小的放入新链表
if (m1.val < m2.val) {
cur.next = m1;
m1 = m1.next;
} else {
// 将大的放入新链表
cur.next = m2;
m2 = m2.next;
}
cur = cur.next;
}
// 如果有一个链表已经遍历完了,那么直接将另一个链表的剩余部分接到cur.next
cur.next = m2 ? m2 : m1;
return dummyHead.next;
};
题目2:23. 合并K个升序链表
分析
1、利用上面解出的合并两个链表的方法,将数组链表的值两两放到该方法里面求和;
var mergeKLists = function(lists) {
let prev = null;
for(let i = 0; i < lists.length; i++) {
if(!prev) {
prev = lists[i];
continue;
}
prev = mergeTwoLists(prev, lists[i]);
}
return prev;
};
var mergeTwoLists = function (l1, l2) {
let dummyHead = new ListNode(-1);
let m1 = l1;
let m2 = l2;
let cur = dummyHead;
while (m1 && m2) {
if (m1.val < m2.val) {
cur.next = m1;
m1 = m1.next;
} else {
cur.next = m2;
m2 = m2.next;
}
cur = cur.next;
}
cur.next = m2 ? m2 : m1;
return dummyHead.next;
};
写在最后
本来的解答都经过了力扣的校验,文章写的有些匆忙,实现方式上有啥不足的欢迎指正,如果还有其它好的实现方式也欢迎在留言区讨论。