[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
相关推荐
我要见SA姐117 分钟前
Chrome 扩展安全攻防实录:从权限滥用到供应链投毒
运维·人工智能·python·机器学习·自动化
2601_9628857221 分钟前
给 backtrader 接 A 股数据:用 AlphaFeed 喂PandasData
python
YYYing.42 分钟前
【Agent系列 (十一) 】上下文工程
人工智能·python·ai·agent·上下文工程
计算机毕业编程指导师1 小时前
基于深度学习的光伏组件红外图像缺陷识别系统设计与实现
人工智能·python·深度学习·目标检测·毕业设计·课程设计·光伏
前端精髓1 小时前
langchain 短期记忆(状态)动态运行时上下文
python·langchain
AiNightVision2 小时前
无人机夜视模块如何选择?——从参数指标到系统集成的完整选型指南
人工智能·算法·计算机视觉·车载系统·无人机·视频·智能硬件
最强小杰2 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai
牧羊人.3333 小时前
卷积神经网络之VGG
人工智能·深度学习·神经网络·算法·cnn
DeepVisionary3 小时前
为拿并网许可,OpenAI在佐治亚新园区同意高峰期断电三成
python·自动化
小郎君6583 小时前
Vue 多标签页的加载态设计:为什么我没有用 Suspense 实现 PageLoading
vue.js·算法