zoukankan      html  css  js  c++  java
  • 【LeetCode每天一题】 Merge k Sorted Lists(合并K个有序链表)

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

    Example:Input:

    [
      1->4->5,
      1->3->4,
      2->6
    ]
    Output: 1->1->2->3->4->4->5->6

    思路

      这道题最简单的方法就是我们将K个链表中的所有数据都存进数组中,然后对数据进行排序。排序完毕之后在依此对数组中的数据进行链表的构造。时间复杂度为O(n log n),n 是链表元素的总和。
      第二种思路是我们我们可以将列表中两个链表两个链表进行合并,直到最后合并完只剩下一条链表,就是排序之后的链表。时间复杂度为O(Nlog k)(N是总的元素数),空间复杂度为O(1)。
    第二种图示

    第一种方法的解决代码

     1 class Solution(object):
     2     def mergeKLists(self, lists):
     3         """
     4         :type lists: List[ListNode]
     5         :rtype: ListNode
     6         """
     7         self.nodes = []
     8         head = point = ListNode(0)    # 设置哨兵节点
     9         for l in lists:                  # 循环遍历列表中每一个链表,将元素添加进数组。
    10             while l:                     # 将当前链表中的元素进行添加
    11                 self.nodes.append(l.val)
    12                 l = l.next
    13         for x in sorted(self.nodes):          # 将排序之后的数组中的元素,构造链表。
    14             point.next = ListNode(x)
    15             point = point.next
    16         return head.next

    第二种方法的解决代码


     1 class Solution(object):
     2     def mergeKLists(self, lists):
     3         """
     4         :type lists: List[ListNode]
     5         :rtype: ListNode
     6         """
     7         amount = len(lists)          # 计算出K的数值
     8         interval = 1                        # 间距
     9         while interval < amount:    # 先从间距1开始合并,
    10             for i in range(0, amount - interval, interval * 2): 
    11                 lists[i] = self.merge2Lists(lists[i], lists[i + interval])   # 使用两个链表的合并函数进行合并。
    12             interval *= 2        # 当上一次间距合并完之后,将间距扩大为2倍。
    13         return lists[0] if amount > 0 else lists      # 当列表链表数大于0时,返回第一个链表(排序好的链表)。
    14  
    15     def merge2Lists(self, l1, l2):         # 两个链表进行合并成一个链表。
    16         head = point = ListNode(0)       # 设置哨兵节点
    17         while l1 and l2:
    18             if l1.val <= l2.val:
    19                 point.next = l1
    20                 l1 = l1.next
    21             else:
    22                 point.next = l2
    23                 l2 = l1
    24                 l1 = point.next.next
    25             point = point.next
    26         if not l1:                            #  其中一个链表不为空,就将其添加到后面。
    27             point.next=l2
    28         else:
    29             point.next=l1
    30         return head.next
  • 相关阅读:
    搞定Mac Maven
    《数学之美》读书笔记
    Scalable Web Architecture and Distributed Systems
    【程序员】修炼之书
    用平常心,做非常事(字节跳动九周年张一鸣演讲)
    动态规划题目总结
    Spring Boot 启动时,让方法自动执行的 4 种方法!
    MybatisGenerator生成mapper、dao、entity
    HTTPS的GET、POST、PUT、DELETE请求
    SpringBoot使用Slf4j进行日志配置
  • 原文地址:https://www.cnblogs.com/GoodRnne/p/10662223.html
Copyright © 2011-2022 走看看