题目描述
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
例如:
输入:
[
1->3->4,
2->5->8
]
输出:
1->2->3->4->5->8
解法
-
方法一:先将元素放到数组中排好序再放到链表中
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode[]} lists * @return {ListNode} */ var mergeKLists = function(lists) { // 首先对特殊情况进行优先处理 1-数组内没有数据 2-数组内只有一个元素 const len = lists.length if(len === 0) return [] if(len === 1) return lists[0] // 正常情况下处理 const numArr = new Array() for(let i = 0; i < len; i++){ let tempNode = lists[i] while(tempNode){ numArr.push(tempNode.val) tempNode = tempNode.next } } // 对数组进行排序 numArr.sort((a,b) => a-b) // 将排好序的数组放回到链表中 const result = new ListNode() const resultNode = result for(let i = 0 ; i < numArr.length; i++){ const node = new ListNode(numArr[i]) resultNode.next = node resultNext = resultNode.next } return result.next }分析:
- 遍历数组 O(n)
- 排序 快速排序 O(log n)
- 最后遍历排序数组 O(n)
总结: 好久都没有做过算法题了,这算是这段时间做的第一道,目前懂了这种方法,后面发现/理解了更好的方法再更新,希望能一直坚持下来