【hot100】刷题记录(52)-合并K个升序链表

题目描述:

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

 

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
  1->4->5,
  1->3->4,
  2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

示例 2:

输入:lists = []
输出:[]

示例 3:

输入:lists = [[]]
输出:[]

 

提示:

  • k == lists.length
  • 0 <= k <= 10^4
  • 0 <= lists[i].length <= 500
  • -10^4 <= lists[i][j] <= 10^4
  • lists[i] 按 升序 排列
  • lists[i].length 的总和不超过 10^4

 

我的作答:

就是全部转换为数组,数组排序后再新建一个链表,听着很繁琐,空间复杂度也高但是很简单。。

# 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]:
        if not lists: return None
        nums = []
        for i in range(len(lists)): #把链表元素全部提取出来变成数组
            cur = lists[i]
            while cur:
                nums.append(cur.val)
                cur = cur.next
        nums.sort() #给数组排序
        if not nums: return None
        head = ListNode(nums[0])
        if len(nums)==1: return head
        node = ListNode()
        head.next = node
        for i in range(1, len(nums)): #新建一个链表,把数组元素挨个转换过去
            node.val = nums[i]
            if i<len(nums)-1:
                next_node = ListNode()
                node.next = next_node
                node = next_node
        return head

 

参考:

使用堆的方法

# 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]:
        h = [(lists[i].val, i, lists[i]) for i in range(len(lists)) if lists[i]]
        heapify(h)
        dummy = ListNode(-1, None)
        cur = dummy
        while h:
            _, i, node = heappop(h)
            cur.next = node
            if node.next:
                heappush(h, (node.next.val, i, node.next))
            cur = cur.next
        return dummy.next

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值