合并k个有序链表 python_leecode刷题(27)-- 合并k个排序链表

leecode刷题(27)-- 合并k个排序链表

合并k个排序链表

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:

[

1->4->5,

1->3->4,

2->6

]

输出: 1->1->2->3->4->4->5->6

思路

以前做过合并两个有序链表的问题,所以刚开始想到的解法与之类似,我们可以先合并两个有序链表,再用合并的新链表去合并第三个链表:

1->1->3->4->4->5

1->1->2->3->4->4->5->6

其实如果我们学习过堆相关的知识,还可以用最小堆来解决这个问题:

读取所有链表值

构造一个最小堆(python中有 headp 方法,java中有 PriorityQueue 方法

根据最小堆构造一个链表

代码如下

python 描述

# Definition for singly-linked list.

# class ListNode:

# def __init__(self, x):

# self.val = x

# self.next = None

from heapq import heapify, heappop

class Solution:

def mergeKLists(self, lists: List[ListNode]) -> ListNode:

# 读取所有节点值

h = []

for node in lists:

while node:

h.append(node.val)

node = node.next

if not h:

return None

# 构造一个最小堆

heapify(h) # 转换为最小堆

# 构造链表

root = ListNode(heappop(h))

curnode = root

while h:

nextnode = ListNode(heappop(h))

curnode.next = nextnode

curnode = nextnode

return root

java 描述

/**

* Definition for singly-linked list.

* public class ListNode {

* int val;

* ListNode next;

* ListNode(int x) { val = x; }

* }

*/

class Solution {

public ListNode mergeKLists(ListNode[] lists) {

// 读取所有节点值

List h = new ArrayList();

for (ListNode node: lists) {

while (node != null) {

h.add(node.val);

node = node.next;

}

}

// 构造一个最小堆

if (!h.isEmpty()) return null;

PriorityQueue priorityQueue = new PriorityQueue();

// 将元素添加进最小堆中

for (Integer h1: h) {

priorityQueue.offer(h1);

}

//构造链表

ListNode root = priorityQueue.poll();

ListNode curNode = root;

while (!priorityQueue.isEmpty()) {

ListNode nextNode = priorityQueue.poll();

curNode.next = nextNode;

curNode = nextNode;

}

return root;

}

}

总结

上述 python 的代码能通过提交,但是 java 代码部分我快被类型转换弄晕了,代码不能通过运行,这里只是给出一种思路,日后有时间自己会再完善的,写下来也是当作自己学习记录的一部分,希望看到文章的小伙伴能帮忙指出本人的不足。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值