[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  

相关内容

热门资讯

黑科技辅助!(来玩app德州扑... 黑科技辅助!(来玩app德州扑克)外挂辅助脚本,(众合推扑克)其实真的是有挂,AI教程(有挂辅助)是...
系统辅助挂(德扑之星)软件可靠... 系统辅助挂(德扑之星)软件可靠吗(AI)看底牌(原来真的是有挂)1、系统规律教程、辅助透视等服务,为...
黑科技挂"微扑克ai... 黑科技挂"微扑克ai辅助工具!外挂透明挂辅助器(黑科技)详细教程"一直有挂1、下载好微扑克ai辅助工...
黑科技智能ai!(WPk)透视... 黑科技智能ai!(WPk)透视辅助插件,(wPK)原先真的是有挂,可靠教程(有挂技巧);1分钟了解详...
详细黑科技(AAPOkER)辅... 详细黑科技(AAPOkER)辅助软件开发定制(透视)外挂购买(本来存在有挂)1、系统规律教程、辅助透...
黑科技安装"wepo... 黑科技安装"wepower有辅助软件吗!外挂透明挂辅助app(黑科技)黑科技教程"果然存在有挂进入游...
黑科技好牌!(德州aa扑克)透... 黑科技好牌!(德州aa扑克)透明挂辅助脚本,(aapokEr)先前真的是有挂,攻略教程(有挂方法)科...
黑科技玄学"微扑克w... 黑科技玄学"微扑克wpk辅助存在吗!外挂透明挂辅助挂(黑科技)可靠技巧"总是真的是有挂1、构建自己的...
黑科技黑科技(AAPOker)... 黑科技黑科技(AAPOker)是正规的吗(透视)这个软件靠谱(确实是真的有挂);1、ai机器人多个强...
黑科技真的!(wpK)透视辅助... 1、黑科技真的!(wpK)透视辅助器,(Wpk)一向真的有挂,力荐教程(有挂透明)。2、wpK透视辅...