LeetCode之算法面试之优先队列之前k个高频元素(347)、合并k个有序链表(23)

1、合并k个有序链表(23)

题目描述:

【困难题】

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

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

在这里插入图片描述

题目链接
思路分析

题解一:暴力法

先把所有的值放在一个数组里,然后对数组排序。

# 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[ListNode]) -> ListNode:
        nums=[]
        for i in range(len(lists)):
            while lists[i]:
                nums.append(lists[i].val)
                lists[i]=lists[i].next
        nums.sort()
        dummy=ListNode(1)# 哑结点
        p=dummy
       
        for num in nums:
            p.next=ListNode(num)
            p=p.next
        return dummy.next
  • 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
  • 空间复杂度: O ( n ) O(n) O(n)

题解二:两两合并

逐个调用Leetcode-21 合并两个有序链表里的合并两个链表的函数。

# 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[ListNode]) -> ListNode:
        while len(lists)>1:
            a=lists.pop() if len(lists) > 0 else None
            b=lists.pop() if len(lists) > 0 else None
            lists.insert(0,self.mergeTwolists(a,b))
        return None if len(lists)<1 else lists[0]
    def mergeTwolists(self, l1,l2):
        prehead=ListNode(0) # 建立虚拟节点
        prev=prehead
        while l1 and l2:
            if l1.val<l2.val:
                prev.next=l1
                l1=l1.next
            else:
                prev.next=l2
                l2=l2.next
            prev=prev.next
        prev.next=l1 if l1 is not None else l2
        return prehead.next

题解三:优先队列

利用一个长度为K的优先级队列

每次把K个链表的当前头的val塞进优先级队列,取pop出来的值作为结果链表的val.

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
from heapq import *
class Solution:
    def mergeKLists(self, lists: List[ListNode]) -> ListNode:
        pq=[]
        for i in range(len(lists)):
            if lists[i]:
                heappush(pq,(lists[i].val,i))
                lists[i]=lists[i].next
        dummy=ListNode(1)
        p=dummy
        while pq:
            val,idx=heappop(pq)
            p.next=ListNode(val)
            p=p.next
            if lists[idx]:
                heappush(pq,(lists[idx].val,idx))
                lists[idx]=lists[idx].next
        return dummy.next

2、前k个高频元素(347)

题目描述:

【中等题】

给定一个非空的整数数组,返回其中出现频率前 k 高的元素。
在这里插入图片描述
题目链接
思路分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值