[NeetCode 150] Merge K Sorted Linked Lists
创始人
2025-01-10 17:04:35
0

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:

# 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”.

# 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  

相关内容

热门资讯

步骤外挂透视hhpoker德州... 步骤外挂透视hhpoker德州透视,wepokerplus到底是挂了吗-哔哩哔哩>>您好:软件加13...
第9分钟带你了解!潮汕激k辅助... 第9分钟带你了解!潮汕激k辅助器(辅助挂)原来是有挂的(今日头条)-哔哩哔哩;1.潮汕激k辅助器 a...
学习外挂透视德普软件,wepo... 较多好评“微乐万能挂官网”开挂(透视)辅助教程 了解更多开挂安装加(136704302)微信号是一款...
五分钟带你解说!微信小程序边锋... 五分钟带你解说!微信小程序边锋辅助下载(辅助挂)一贯确实有挂(有挂技术)-哔哩哔哩;致您一封信;亲爱...
指南外挂透视we-poker辅... aapoker安装包怎么使用是一款可以让一直输的玩家,快速成为一个“必胜”的ai辅助神器,有需要的用...
7分钟带你透视!大唐麻雀辅助器... 7分钟带你透视!大唐麻雀辅助器怎么设置(辅助挂)其实有挂(有挂详情)-哔哩哔哩;大家肯定在之前大唐麻...
讲义外挂透视竞技联盟透视插件,... 讲义外挂透视竞技联盟透视插件,hhpoker有后台操控吗-哔哩哔哩【无需打开直接搜索加薇136704...
三分钟带你得知!广东雀神智能插... 三分钟带你得知!广东雀神智能插件有什么功能(辅助挂)原来是有挂(有挂功能)-哔哩哔哩;1、不需要AI...
技法外挂透视红龙poker有辅... 【亲,红龙poker有辅助吗 这款游戏可以开挂的,确实是有挂的,很多玩家在这款红龙poker有辅助吗...
1分钟带你解说!情怀打七辅助(... 1分钟带你解说!情怀打七辅助(辅助挂)一贯确实有挂(真的有挂)-哔哩哔哩;最新版2026是一款经典耐...