[NeetCode 150] Merge K Sorted Linked Lists

Merge K Sorted Linked Lists

You are given an array of k linked lists lists, where each list is sorted in ascending order.

Return the sorted linked list that is the result of merging all of the individual linked lists.

Example 1:

复制代码
Input: lists = [[1,2,4],[1,3,5],[3,6]]

Output: [1,1,2,3,3,4,5,6]

Example 2:

复制代码
Input: lists = []

Output: []

Example 3:

复制代码
Input: lists = [[]]

Output: []

Constraints:

复制代码
0 <= lists.length <= 1000
0 <= lists[i].length <= 100
-1000 <= lists[i][j] <= 1000

Solution

To take advantage of the feature that each list is sorted in ascending order, it is OK to use O ( number of elements in 2 lists ) O(\text{number of elements in 2 lists}) O(number of elements in 2 lists) two pointers method to merge 2 ordered lists. The overall time complexity will be O ( number of all elements × number of linked lists ) O(\text{number of all elements}\times \text{number of linked lists}) O(number of all elements×number of linked lists).

We can accelerate this process by a simple priority queue, reducing the time complexity to O ( n log ⁡ n ) O(n\log n) O(nlogn), where n n n denotes the total number of all elements in linked lists.

However, by using hash, or bucket sort, wo can achieve O ( V ) O(V) O(V) time complexity, where V V V denotes the size of the discrete value domain of elements, and V ≤ n V\le n V≤n. Additionally, it does not require the given linked lists to be ordered.

To be more detailed, we can use a dictionary to store the nodes of different values and link them together in the end. The code might look like:

python 复制代码
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next

class Solution:    
    def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
        buket = {number:None for number in range(-1000, 1001)}
        for node in lists:
            while node.next:
                buket[node.val].append(node)
                node = node.next
            buket[node.val].append(node)
        preNode = None
        rootNode = None
        for value in buket.values():
            for node in value:
                if preNode:
                    preNode.next = node
                else:
                    rootNode = node
                preNode = node
        return rootNode

However, that is not perfect! As the elements are all stored in linked lists, we only need to store the head and tail nodes of each value. When a new element coming in, we just link it as the new head/tail. In the end, we only need to link head and tail of different values' linked list one by one. This method only takes O ( V ) O(V) O(V) extra space and O ( V ) O(V) O(V) time to link.

Code

Please ignore the typo of "bucket".

python 复制代码
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next

class Solution:    
    def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
        head_buket = {}
        tail_buket = {}
        for node in lists:
            while True:
                if node.val not in tail_buket:
                    tail_buket[node.val] = node
                nextNode = node.next
                node.next = head_buket.get(node.val, None)
                head_buket[node.val] = node
                node = nextNode
                if node is None:
                    break
        preNode = None
        rootNode = None
        for key in range(-1000, 1001):
            if key in head_buket:
                if preNode is None:
                    rootNode = head_buket[key]
                else:
                    preNode.next = head_buket[key]
                preNode = tail_buket[key] 
        return rootNode
相关推荐
iAkuya5 分钟前
(leetcode)力扣100 18矩阵置零(哈希)
leetcode·矩阵·哈希算法
Wpa.wk9 分钟前
自动化测试(java) - PO模式了解
java·开发语言·python·测试工具·自动化·po模式
徐先生 @_@|||11 分钟前
Java/Maven 对比 Python/PyPI
开发语言·python
点云侠13 分钟前
粒子群优化算法求解三维变换矩阵的数学推导
线性代数·算法·矩阵
嘻嘻嘻开心20 分钟前
Collection接口
linux·windows·python
dragoooon3421 分钟前
[hot100 NO.31~36]
数据结构·算法·排序算法
白兰地空瓶22 分钟前
JavaScript 列表转树(List to Tree)详解:前端面试中如何从递归 O(n²) 优化到一次遍历 O(n)
javascript·算法·面试
rebekk23 分钟前
什么时候会用到python -m
python
艾醒24 分钟前
大模型原理剖析——从技术特性、底层架构到落地逻辑的全维度解析
算法
Liangwei Lin36 分钟前
洛谷 B3637 最长上升子序列
算法