这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。
16. 合并K个升序链表 (merge-k-sorted-lists)
标签
- LinkList
- 分治
- 递归
- 困难
题目
这里不贴题了,leetcode打开就行,题目大意:
合并K个升序链表,还记得这篇,合并2个升序链表, 这个是困难版。
相关知识
- 分而治之
- 链表两两合并
基本思路
分治法的典型应用,还能借助2个列表合并的部分代码完成。
写法实现
// 分治,我们把大问题化小问题
var mergeKLists = function(lists) {
let len = lists.length
if (len === 0) {
return null
}
if (len === 1) {
return lists[0]
}
let midIdx = Math.floor(len / 2)
let leftList = mergeKLists(lists.slice(0, midIdx))
let rightList = mergeKLists(lists.slice(midIdx, len))
return mergeTwoLists(leftList, rightList)
};
// 递归合并两个链表,方法同之前简单的
var mergeTwoLists = function(l1, l2) {
if (l1 === null) {
return l2
} else if (l2 === null) {
return l1
} else if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2)
return l1
} else {
l2.next = mergeTwoLists(l1, l2.next)
return l2
}
};
年初七就来一题吧。
今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦
搜索我的微信号infinity_9368,可以聊天说地
加我暗号 "天王盖地虎" 下一句的英文,验证消息请发给我
presious tower shock the reiver monster,我看到就通过,暗号对不上不加哈