[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 Vn. 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. [NeetCode 150] Valid Sudoku

    2024-07-14 16:08:02       26 阅读
  2. [NeetCode 150] Word Ladder

    2024-07-14 16:08:02       24 阅读
  3. [NeetCode 150] Redundant Connection

    2024-07-14 16:08:02       27 阅读
  4. [NeetCode 150] Longest Consecutive Sequence

    2024-07-14 16:08:02       23 阅读
  5. [NeetCode 150] Products of Array Discluding Self

    2024-07-14 16:08:02       25 阅读
  6. [NeetCode 150] Merge K Sorted Linked Lists

    2024-07-14 16:08:02       28 阅读
  7. LeetCode 150, 112, 130

    2024-07-14 16:08:02       19 阅读
  8. DAY 10 | 1047, (20,150)

    2024-07-14 16:08:02       52 阅读
  9. 面试经典150题(96-100)

    2024-07-14 16:08:02       54 阅读
  10. 面试经典150题(108-110)

    2024-07-14 16:08:02       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 16:08:02       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 16:08:02       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 16:08:02       62 阅读
  4. Python语言-面向对象

    2024-07-14 16:08:02       72 阅读

热门阅读

  1. AWS S3 基本概念

    2024-07-14 16:08:02       25 阅读
  2. 大型土木工程项目灾害防御规划与风险评估系统

    2024-07-14 16:08:02       22 阅读
  3. MySQL面试题

    2024-07-14 16:08:02       18 阅读
  4. 【QT系列】快速了解QT怎么用

    2024-07-14 16:08:02       27 阅读
  5. 【Linux 基础】df -h 的输出信息解读

    2024-07-14 16:08:02       28 阅读
  6. 老生常谈的页面渲染流程

    2024-07-14 16:08:02       21 阅读
  7. 虚拟地址空间(Virtual Address Space, VAS)

    2024-07-14 16:08:02       22 阅读
  8. 定期更新github相关hosts

    2024-07-14 16:08:02       24 阅读
  9. 前端面试题日常练-day86 【面试题】

    2024-07-14 16:08:02       19 阅读