O(N lgK) 时间内合并K个有序链表

机器学习之性能度量 废话不说,本文分为两个部分: 第一部分,我对周志华教授《机器学习》这本书中性能度量知识点中疑难点的学习感悟;第二部分,我感觉该书2.3节 性能度量 中最后部分的代价曲线表述有误,苦于没找到联系教授的正确方式,故希望与广大网友一起探讨。 阅读详情

问题:

在O(N lgK) 时间内合并K个有序链表, 这里N指的是K个链表中所有的元素个数。

分析:

这是一道非常经典的面试题,在很多大公司的面试题中,此题频繁出现。这题也是算法导论的作业题。

这题的思路如下:

1) 在每一个链表中取出第一个值,然后把它们放在一个大小为K的数组里,然后把这个数组当成heap,然后把该堆建成最小堆。此步骤的时间复杂度为O(K)

2 )取出堆中的最小值(也是数组的第一个值),然后把该最小值所处的链表的下一个值放在数组的第一个位置。如果链表中有一个已经为空(元素已经都被取出),则改变heap的大小。然后,执行MIN-HEAPIFY操作,此步骤的时间复杂度为O(lg K).

3 ) 不断的重复步骤二,直到所有的链表都为空。

代码如下:

class ListNode {
	int val;
	ListNode next;
	ListNode(int x) {
		val = x;
		next = null;
	}
}
  
public class Solution {
	public static void main(String[] args) {
			
		ListNode n1 = new ListNode(1);
		ListNode n7 = new ListNode(2);
		ListNode n9 = new ListNode(2);
		ListNode n2 = new ListNode(1);
		ListNode n4 = new ListNode(1);
		ListNode n8 = new ListNode(2);
	
		ArrayList<ListNode> lists = new ArrayList<ListNode>();	
		n1.next = n7;
		n7.next = n9;
		n2.next = n4;
		n4.next = n8;
		
		lists.add(n1);
		lists.add(n2);
		
		Solution test = new Solution();
		ListNode head = test.mergeKLists(lists);
		while(head != null) {
			System.out.println(head.val);
			head = head.next;
		}
	}
	
    public ListNode mergeKLists(ArrayList<ListNode> lists) {
        ArrayList<ListNode> heap = new ArrayList<ListNode>();
        for (int i = 0; i < lists.size(); i++) {
            if (lists.get(i) != null) {
                heap.add(lists.get(i));
            }
        }
        
        ListNode head = null;
        ListNode current = null;
        if (heap.size() == 0) return null;
        minHeapify(heap);
        while (heap.size() != 0) {
            if (head == null) {
                head = heap.get(0);
                current = heap.get(0);
            } else {
                current.next = heap.get(0);
                current = current.next;
            }
            
            if (current.next != null) {
                heap.set(0, current.next);
                heapify(heap, 0);
            } else {
                heap.remove(0);
                minHeapify(heap);
            }
        }
        return head;
    }
    
    public void heapify(ArrayList<ListNode> heap, int index) {
        int position = index;
        int left = 2 * index + 1;
        int right = 2 * index + 2; 
        
        if(left < heap.size() && heap.get(left).val < heap.get(position).val) {
            position = left;
        }
        
        if(right < heap.size() && heap.get(right).val < heap.get(position).val) {
            position = right;
        }
        
        if (position != index) {
            ListNode temp = heap.get(position);
            heap.set(position, heap.get(index));
            heap.set(index, temp);
            heapify(heap, position);
        }
    }
    
    public void minHeapify(ArrayList<ListNode> heap) {
        for (int i = heap.size()/2 - 1; i >= 0; i--) {
            heapify(heap, i);
        }
    }
}

Another Version: The time complexity is O(nk).

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode mergeKLists(ArrayList<ListNode> lists) {
        ListNode head = null;
        ListNode current = null;
        
        boolean isAllNull = false;
        while (!isAllNull) {
            isAllNull = true;
            ListNode min = null;
            int position = -1;
            for (int i = 0; i < lists.size(); i++) {
                if (min == null && lists.get(i) != null) {
                    min = lists.get(i);
                    isAllNull = false;
                    position = i;
                } else if (lists.get(i) != null){
                    isAllNull = false;
                    if (min.val > lists.get(i).val) {
                        min = lists.get(i);
                        position = i;
                    }
                }
            }
            if (head == null) {
                head = min;
                current = min;
            } else {
                current.next = min;
                current = current.next;
            }
            if (position != -1) {
                lists.set(position, lists.get(position).next);
            }
        }
        return head;
    }
}

转载请注明出处:http://blog.youkuaiyun.com/beiyeqingteng


STM32F103C8T6+TB6612驱动直流电机全攻略(附PWM调速代码) 本文提供了一份基于STM32F103C8T6微控制器和TB6612驱动模块的直流电机驱动完整解决方案。详细解析了硬件连接、STM32CubeMX配置、HAL库驱动代码编写,并附带了PWM调速代码实现。内容涵盖从基础原理到实战调试的全过程,旨在帮助开发者快速构建稳定、可精准调速的电机控制系统,适用于智能车、机器人等嵌入式项目。 阅读详情

相关推荐

在 NVIDIA Orin (JetPack 6.0) 上配置 PyTorch 2.4 + Torchvision 0.19 的完整避坑指南

本文提供在NVIDIA Jetson Orin设备上,基于JetPack 6.0系统配置PyTorch 2.4与Torchvision 0.19环境的完整指南。通过使用Miniconda环境隔离、安装特定版本PyTorch夜间构建版、编译匹配的Torchvision源码等步骤,解决版本不匹配、CUDA支持等常见问题,确保AI开发环境稳定可用。

weixin_29179311的博客 365

战争与格瓦特发现了更具预测性的投战

Back in May of this year, we introduced kWAR, a pitching WAR statistic which we hoped would provide a more predictive alternative to fWAR. By utilizing kwERA’s simple focus on a pitcher’s strikeout an...

weixin_26642481的博客 701

别再死磕USB HID了!用ESP32的Arduino框架手把手教你实现蓝牙鼠标键盘(附完整代码)

本文详细介绍了如何使用ESP32的Arduino框架实现蓝牙HID设备,包括鼠标和键盘的快速开发。通过现成的库和示例代码,开发者可以轻松打造自定义蓝牙外设,无需复杂的USB HID协议栈,适用于演示控制器、宏键盘等多种场景。

weixin_31309419的博客 261

算法面试题:合并有序链表系列(合并两个,合并n个)分治算法

算法面试题:合并有序链表系列(合并两个,合并n个) 内容目录算法面试题:合并有序链表系列(合并两个,合并n个)一、合并两个有序链表方法1方法2:二、合并n个有序链表分治解法: 合并有序链表问题,可以分为两种,一种是合并两个有序链表,另一种是合并n个有序链表 一、合并两个有序链表 合并两个链表,可以想到的方法大概分为两种 一种是开辟一个空间,逐渐比较两个链表,小的放到空间中,以此类推 一种是不开辟另外的空间,直接使用list1或者list2 方法1 public ListNode Merge(ListNo

weixin_46429290的博客 2019

使用BK3432芯片进行蓝牙开发的详细指南:编程手册与实际应用

BK3432是一款蓝牙4.2双模式芯片,支持蓝牙低功耗(BLE)和经典蓝牙(BR/EDR)模式。它集成了高性能的RF收发器、基带处理器、ARM9E内核、丰富的功能外设单元,并支持BLE应用的可编程协议和概要文件。蓝牙版本:4.2数据速率:最高支持2Mbps内核:ARM9ERF收发器:高性能、低功耗外设单元:包括UART、SPI、I2C、GPIO等功耗:超低功耗设计,适合电池供电的应用。

m0_57781768的博客 4450

汽车TARA分析实战:从威胁建模到安全需求落地的完整指南

在汽车电子电气系统开发中,威胁分析与风险评估(TARA)是确保功能安全与网络安全的核心方法论。其原理在于通过结构化的流程,系统性地识别资产、分析威胁场景并评估风险,旨在将安全理念前置,从设计源头规避风险。这一过程的技术价值在于将模糊的安全担忧转化为可量化、可追溯的工程需求,从而指导资源精准投放,是符合ISO 26262和ISO/SAE 21434标准要求的关键实践。其应用场景贯穿智能汽车从概念设计到系统开发的各个阶段,尤其对于涉及自动驾驶、智能座舱、车云通信等复杂功能的域控制器开发至关重要。本文聚焦于TAR

weixin_42706667的博客 306

合并多个有序链表(PriorityQueue)

合并多个有序链表(PriorityQueue)

XZB119211的博客 840

【Python】SimpleITK使用笔记

1. 概念 1.1 nii格式 1.2 SimpleITK 1.3 SimpleITK 图像 2. 基本操作 2.1 常见属性 2.1 读取和保存图像 2.2 SimpleITK图像数据和Numpy矩阵数据之间的转换

See_Star的博客 7900

【每日算法 && 数据结构(C++)】—— 06 | 合并多个有序链表(解题思路、流程图、代码片段)

【每日算法 && 数据结构】第六篇之《合并多个有序链表》,主要记录了题目描述、题目理解、解题思路、算法流程以及算法的时间空间复杂度,最后附上C++实现代码片段。期待各位大佬的指点

再努力一点点就好了 1328

《AI编程实战:深度学习模型改进与系统部署》,改进专栏目录和介绍

专深度学习相关项目都写在本专栏,《一次订阅解锁全部,都有源码,永久观看》,包括车牌识别、股票预测、人脸识别、风格迁移、图像修复、图像超分辨重建、图像分割等任务,Web/PyQt系统实现。引入Transformer、Swin Transformer、DenseNet、ViT、ConvNeXt等算法实战,提供卷积改进,魔改对比实验,模型剪枝,模型蒸馏,模型量化,全网独家整合改进专栏,为不同领域的同学发表论文提供了大力支持。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3272

【现代人形机器人:从物理建模到大模型驱动的控制与学习】第1章 机器人建模回顾

本章建立读者进行后续控制 / 优化 / 学习工作的数学与计算基础。内容分为三大块:刚体运动学:位姿表示、坐标变换、旋转参数与李代数/李群(指数映射、twist)多关节机构的正/逆运动学:DH 与 POE 两种建模、雅可比矩阵推导、数值/解析逆解方法与奇异性问题约束动力学:拉格朗日公式、牛顿—欧拉递归算法、接触/冲击模型、受约束系统的方程(拉格朗日乘子与互补性条件)每一节同时给出与练习题。假设读者已具备线性代数(矩阵、特征分解、SVD)、多变量微积分与基础力学(牛顿第二定律)知识。

u012133341的博客 185

链表有序表的合并

链表有序表的合并

Xiao_Ya__的博客 3738

Kimodo 入门教程(一)英伟达开源人形机器人动捕数据集训练运动学动作扩散模型

Kimodo是一个基于700小时商用光学动作捕捉数据集训练的运动学动作扩散模型,能够生成高质量的人体和机器人3D动作。该模型支持通过文本提示和多种约束条件(如关键帧、末端执行器位置等)进行控制,并提供数字人类和类人机器人两种模型变体。安装方式包括软件包安装和源代码安装两种,需要配置HuggingFace令牌以访问文本编码器。推荐使用GPU加速,最低需要17GB显存。项目提供命令行生成和交互式演示两种使用方式,演示程序支持时间轴编辑和实时3D可视化。模型分为商用友好版和受限版,其中SMPL-X版本需要额外申请

2506_90492529的博客 1932

在O(N lgK) 时间内合并K个有序链表

问题: 在O(N lgK) 时间内合并K个有序链表, 这里N指的是K个链表中所有的元素个数。 分析: 这是一道非常经典的面试题,在很多大公司的面试题中,此题频繁出现。这题也是算法导论的作业题。 这题的思路如下: 1) 在每一个链表中取出第一个值,然后把它们放在一个大小为K的数组里,然后把这个数组当成heap,然后把该堆建成最小堆。此步骤的时间复杂度为O(K) 2 )取出堆中的最小值(也是数组的第一个

zs5868668的博客 307

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

最大堆k路归并

问题:设计一个时间复杂度为O(n*lgk)的算法,它能够将k个有序链表合并为一个有序表,这里n是所有输入链表包含的总的元素个数

u011418829的专栏 404

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Leetcode Merge sorted lists问题

merge two sorted lists[code]public class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if(l1==null)return l2; if(l2==null)return l1; ListNode d=new Li

178

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【Leetcode 23】合并K个排序链表

题目描述 解题思路 解法一:暴力法 遍历k个链表,将所有节点值保存到列表中 将列表排序 遍历排序后的列表,创建一个新的有序链表 python代码 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.ne...

weixin_44549556的博客 176

K个有序链表共N个结点在O(NlgK)时间合并为一个新的有序链表头文件C语言

<br />  <<算法导论>>上的一道思考题,昨天实现的.用到了优先队列.链表我给实现成了队列的方式,比较习惯这样.呵呵.<br />  在这个头文件中,定义了两个数据结构的数据类型和宏,这是第一次尝试.中途遇到过问题, 就是数据多次定义.用了#ifdef这个宏,解决了这个问题.还有,优先队列中,存放的只是指向队列中结点的指针,这在以前对我来说简直就是一个很大很大的挑战.不过目前来看,我的水平有了长进.对于手动实现这个思考题,我感觉很好.凡是我能解决的问题,都把他变成代码.嗯.这样很好.接下来,还有5个文

让阳光照进心里 1810

21. 合并两个有序链表

题目   代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: L...

李正浩的博客 170

合并K个有序链表O(N lgK)

问题:在O(N lgK) 时间内合并K个有序链表, 这里N指的是K个链表中所有的元素个数。 这题的思路如下: 1 ) 在每一个链表中取出第一个值,然后把它们放在一个大小为K的数组里,然后把这个数组当成heap,然后把该堆建成最小堆。O(K) 2 )取出堆中的最小值(也是数组的第一个值),然后把该最小值所处的链表的下一个值放在数组的第一个位置。如果链表中有一个已经为空(元素已经都被

彦祖老师 1902

K个有序链表共N个结点在O(NlgK)时间合并为一个新的有序链表实现文件C语言

<br />先是在 main () 函数中构造输入.之后调用主例程解决问题.可以看到,主例程是相当精妙的.这当然是需要前面数据结构的正确.<br />/* MergeQueue.c -- O (NlogK) 时间将K个有序队列合并为一个新有序队列 */ #include "Queue.h" #include "PriorityQueue.h" #define SIZE (5) int main (void) ; BOOL merge (const Queue * const array,

让阳光照进心里 1486

23 合并K个升序链表

合并k个有序链表

Mirevas的博客 203

[LeetCode]23. 合并K个排序链表

题目 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 解题思路 解法一:暴力法 1、创建一个数组,用来存储链表中的值。遍历每个链表,将元素添加到数组中,之后再对数组排...

zaker123的博客 532

21:合并多个有序链表

21:合并多个有序链表

深入探索技术领域,持续学习成长,追求实践与进步,共同构建技术未来 254

合并k个有序链表

文章目录题目描述分析代码 题目描述 leetcode链接:https://leetcode-cn.com/problems/merge-k-sorted-lists/ 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 分析 `N`:链表总结点数。 `K`:链表个数。 方法一:

记录求学阶段的技术学习、项目实践与成长思考。 3657
上一篇: 一道收集优惠券的面试题
下一篇: 括号匹配
beiyetengqing
博客等级 码龄14年 148粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值