LeetCode 23. 合并K个升序链表

题目链接:

力扣icon-default.png?t=LA92https://leetcode-cn.com/problems/merge-k-sorted-lists/

【方法一 自定义排序】看到这个数据量,组多5*10^6,于是先遍历所有点,放在一个数组中,再根据val排序后,从前向后串起来即可。

# 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) -> ListNode:
        arr = []
        for node in lists:
            p = node
            while p:
                arr.append(p)
                p = p.next
        arr.sort(key=lambda x: x.val)
        for i in range(len(arr) - 1):
            arr[i].next = arr[i + 1]
        arr[-1].next = None

【方法二 分治法 两两合并】如图所示,把list两两分组,按两条的方式合并,再把合并后的新链表两两合并,直到只剩一条。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def merge(self, p, q):
        start = ListNode()
        cur = start
        while p != None and q!= None:
            if p.val < q.val:
                cur.next = p
                p = p.next
            else:
                cur.next = q
                q = q.next
            cur = cur.next
        if p != None:
            cur.next = p
        if q != None:
            cur.next = q
        return start.next

    def mergeKLists(self, lists) -> ListNode:
        if len(lists) == 0:
            return None
        while len(lists) != 1:
            next = []
            i, n = 0, len(lists)
            while True:
                if i + 1 < n:
                    next.append(self.merge(lists[i], lists[i + 1]))
                else:
                    next.append(lists[i])
                i += 2
                if i >= n:
                    break
            lists = next
        return lists[0]

 【方法三 优先队列】利用优先队列把两两合并改成多个一起合并,思路就是先把每一条链的头节点放进优先队列,那么就已经排好顺序了,接下来每次取出最小的,再把取出来节点的next压入优先队列即可。

# 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) -> ListNode:
        import heapq
        priority_queue = []
        for i in range(len(lists)):
            if lists[i]:
                heapq.heappush(priority_queue, (lists[i].val, i))
        start = ListNode()
        cur = start
        while priority_queue != []:
            top = heapq.heappop(priority_queue)
            node = lists[top[1]]
            cur.next = node
            if node.next:
                heapq.heappush(priority_queue, (node.next.val, top[1]))
                lists[top[1]] = node.next
            cur = cur.next
        return start.next

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值