【力扣每日一题】23. 合并 K 个升序链表 暴力法-快排 8.12打卡

请添加图片描述

文章目录

  • 题目
  • 思路
  • 代码

题目

合并 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

思路

时间复杂度分析:因为允许k的长度为10^4,所以O(n2)是肯定过不去的,可以使用O(nlogn)或者更低,提示中标红处是我们需要注意的地方
解法思路:本题我使用的是暴力解法,首先先将这个链表集合中的所有元素进行合并,生成一个长的链表,因为子链表的长度在500范围内,所以时间复杂度最终会是O(n),同时使用快速排序进行排序,最终时间复杂度在O(nlogn)

代码

先将链表集合中的所有子链表合成一条链表:

 public static ListNode mergeKLists(ListNode[] lists) {int k = lists.length;ListNode dummy = new ListNode(-1);ListNode tail = dummy;for(int  i =0;i<k;i++){while(lists[i] != null){ListNode temp = lists[i];lists[i] = lists[i].next;tail.next= temp;tail = tail.next;}}return quickSort(dummy.next);}

然后对链表进行快速排序:
快速排序思路:设置一个中间值,将小于该值的数放在左边,大于的放在右边
针对本题:设置三个链表,一个存储小于的值,一个存储等于的值,一个存储大于的值

public static  ListNode quickSort(ListNode head){if(head == null || head.next == null){return head;}ListNode pivot = head;ListNode lessHead = new ListNode(-1);ListNode lessTail = lessHead;ListNode biggerHead = new ListNode(-1);ListNode biggerTail = biggerHead;ListNode equalHead = new ListNode(-1);ListNode equalTail = equalHead;ListNode current = head;while(current != null){if(current.val < pivot.val){lessTail.next = current;lessTail=lessTail.next;}else if(current.val > pivot.val){biggerTail.next = current;biggerTail = biggerTail.next;}else{equalTail.next = current;equalTail = equalTail.next; }current = current.next;}lessTail.next =null;biggerTail.next =null;equalTail.next = null;ListNode sortedLess = quickSort(lessHead.next);ListNode sortedBigger = quickSort(biggerHead.next);return concer(sortedLess,equalHead.next,sortedBigger);}

然后分别从小到大,依此添加到链表中:

 public static ListNode concer(ListNode less,ListNode euqal,ListNode bigger){ListNode dummyhead = new ListNode(-1);ListNode tail = dummyhead;tail.next = less;tail = getTail(tail);tail.next =euqal ;tail = getTail(tail);tail.next = bigger;return dummyhead.next;}public static ListNode getTail(ListNode head){if(head == null){return null;}while(head.next != null){head = head.next;}return head;}

我这里使用了最简单的方法,还有很多优质的解法,可以参考力扣中大神的做法。

完整代码:

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {//暴力解法public static ListNode mergeKLists(ListNode[] lists) {int k = lists.length;ListNode dummy = new ListNode(-1);ListNode tail = dummy;for(int  i =0;i<k;i++){while(lists[i] != null){ListNode temp = lists[i];lists[i] = lists[i].next;tail.next= temp;tail = tail.next;}}return quickSort(dummy.next);}public static  ListNode quickSort(ListNode head){if(head == null || head.next == null){return head;}ListNode pivot = head;ListNode lessHead = new ListNode(-1);ListNode lessTail = lessHead;ListNode biggerHead = new ListNode(-1);ListNode biggerTail = biggerHead;ListNode equalHead = new ListNode(-1);ListNode equalTail = equalHead;ListNode current = head;while(current != null){if(current.val < pivot.val){lessTail.next = current;lessTail=lessTail.next;}else if(current.val > pivot.val){biggerTail.next = current;biggerTail = biggerTail.next;}else{equalTail.next = current;equalTail = equalTail.next; }current = current.next;}lessTail.next =null;biggerTail.next =null;equalTail.next = null;ListNode sortedLess = quickSort(lessHead.next);ListNode sortedBigger = quickSort(biggerHead.next);return concer(sortedLess,equalHead.next,sortedBigger);}public static ListNode concer(ListNode less,ListNode euqal,ListNode bigger){ListNode dummyhead = new ListNode(-1);ListNode tail = dummyhead;tail.next = less;tail = getTail(tail);tail.next =euqal ;tail = getTail(tail);tail.next = bigger;return dummyhead.next;}public static ListNode getTail(ListNode head){if(head == null){return null;}while(head.next != null){head = head.next;}return head;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/63223.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 9的新特性解读(3)

目录 语法改进&#xff1a;try语句 String存储结构变更 Motivation Description 那StringBuffer 和 StringBuilder 是否仍无动于衷呢&#xff1f; 集合工厂方法&#xff1a;快速创建只读集合 语法改进&#xff1a;try语句 Java 8 中&#xff0c;可以实现资源的自动…

【C语言】数据在内存中的存储详解

文章目录 一、什么是数据类型二、类型的基本归类三、 整型在内存中的存储1.原码、反码、补码2.大小端(1)什么是大小端(2)为什么会有大小端 四、浮点型在内存中的存储1. 浮点数存储规则 五、练习1.2.3.4.5.6.7. 一、什么是数据类型 我们可以把数据类型想象为一个矩形盒子&#x…

Stable Diffuion webui Mac版本安装过程

系统环境 操作系统&#xff1a;MacOS Ventura13.5 芯片&#xff1a;Apple M2 Max Python: 3.10 安装前置准备 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git注意事项&#xff1a;修改源码内全部 git clone 链接&#xff0c;设置代理 https://ghpr…

go语言的database/sql结合squirrel工具sql生成器完成数据库操作

database/sql database/sql是go语言内置数据库引擎&#xff0c;使用sql查询数据库&#xff0c;配置datasource后使用其数据库操作方法对数据库操作&#xff0c;如下&#xff1a; package mainimport ("database/sql""fmt"_ "github.com/Masterminds…

Vue项目npm run dev 启动报错TypeError: Cannot read property ‘upgrade‘ of undefined

vue项目启动报错 TypeError: Cannot read property upgrade of undefined 由于我的vue.config.js文件 里面的代理target为空导致的 修改&#xff1a; 结果就可以正常运行了 参考原文&#xff1a; vue项目运行时报Cannot read property ‘upgrade’ of undefined错误_cannot r…

【100天精通python】Day32:使用python操作数据库_MySQL下载、安装、配置、使用实战

专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/qq_35831906/category_12375510.html 1 MySQL概述 MySQL是一款互联网上广泛使用的开源关系型数据库管理系统。它最初由瑞典的MySQL AB公司开发&#xff0c;并于1995年首次发布。如今&#xff0c;MySQL由Oracle公司维护…

matlab解常微分方程常用数值解法1:前向欧拉法和改进的欧拉法

总结和记录一下matlab求解常微分方程常用的数值解法&#xff0c;本文先从欧拉法和改进的欧拉法讲起。 d x d t f ( x , t ) , x ( t 0 ) x 0 \frac{d x}{d t}f(x, t), \quad x\left(t_{0}\right)x_{0} dtdx​f(x,t),x(t0​)x0​ 1. 前向欧拉法 前向欧拉法使用了泰勒展开的第…

FOHEART H1数据手套:连接虚拟与现实,塑造智能交互新未来

在全新交互时代背景中&#xff0c;数据手套无疑是一种重要的科技产物。它不仅彻底改变了我们与虚拟世界的互动方式&#xff0c;更为我们提供了一种全新、更为直观的交互形式。 FOHEART H1数据手套结合了虚拟现实、手势识别等高新技术&#xff0c;用先进的传感技术和精准的数据…

spring-自定义AOP面向切面注解--统一切面处理-登陆信息采集

2023华为OD统一考试&#xff08;AB卷&#xff09;题库清单-带答案&#xff08;持续更新&#xff09;or2023年华为OD真题机考题库大全-带答案&#xff08;持续更新&#xff09; 1. 先写一个登陆记录注解&#xff08;//记录&#xff1a;XXX时间&#xff0c;XXX姓名&#xff0c;XX…

Pytorch源码搜索与分析

PyTorch的的代码主要由C10、ATen、torch三大部分组成的。其中&#xff1a; C10 C10&#xff0c;来自于Caffe Tensor Library的缩写。这里存放的都是最基础的Tensor库的代码&#xff0c;可以运行在服务端和移动端。PyTorch目前正在将代码从ATen/core目录下迁移到C10中。C10的代…

4.1 Windows终端安全

数据参考&#xff1a;CISP官方 目录 安全安装保护账户安全本地安全策略安全中心系统服务安全其他安全设置软件安全获取 一、安全安装&#xff08;以安装windows系统为例&#xff09; 选择合适的版本 商业版本&#xff1a;家庭版、专业版、专业工作站版、企业版特殊版本&…

云原生k8s---资源限制、探针

目录 一&#xff1a;资源限制 1、资源限制原因 2、Pod 和 容器 的资源请求和限制 3、CPU 资源单位 4、内存 资源单位 5、事例 &#xff08;1&#xff09;事例一 &#xff08;2&#xff09;事例二 二&#xff1a;重启策略 1、重启策略模式 2、事例 三&#xff1a;探针…