[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  

相关内容

热门资讯

每日必看推荐!微信小程序雀神辅... 每日必看推荐!微信小程序雀神辅助器(辅助挂)一贯是真的有辅助工具(有挂详情)1、很好的工具软件,可以...
最新技巧!陕西辅助(辅助挂)一... 最新技巧!陕西辅助(辅助挂)一直是真的有辅助工具(有挂秘诀)陕西辅助是不是有人用挂微扑克wpk插件教...
据玩家消息!决战平安京辅助软件... 据玩家消息!决战平安京辅助软件(辅助挂)总是是有辅助插件(有挂技术)1、决战平安京辅助软件脚本辅助下...
围绕透视问题!陕麻圈延安辅助(... 围绕透视问题!陕麻圈延安辅助(辅助挂)总是确实有辅助技巧(有挂规律);1、完成陕麻圈延安辅助辅助器v...
研究成果!潘潘讲故事app有挂... 研究成果!潘潘讲故事app有挂吗(辅助挂)好像存在有辅助方法(有挂神器)1、很好的工具软件,可以解锁...
截至发稿!微信小程序多乐辅助下... 截至发稿!微信小程序多乐辅助下载(辅助挂)确实存在有辅助器(有挂分析)微信小程序多乐辅助下载辅助器是...
必备攻略!赣湘互娱挂(辅助挂)... 必备攻略!赣湘互娱挂(辅助挂)好像确实有辅助攻略(发现有挂)1、用户打开应用后不用登录就可以直接使用...
目前来看!广西微乐小程序微信辅... 目前来看!广西微乐小程序微信辅助器免费(辅助挂)果然是有辅助插件(有挂教学)1、让任何用户在无需广西...
盘点几款!新超凡软件辅助(辅助... 盘点几款!新超凡软件辅助(辅助挂)果然真的有辅助技巧(真的有挂)1、每一步都需要思考,不同水平的挑战...
揭秘攻略!方片十三张外挂(辅助... 揭秘攻略!方片十三张外挂(辅助挂)真是是有辅助挂(确实有挂)1、方片十三张外挂免费脚本咨询教程、方片...