【算法社区】链表之合并两个有序链表、LRU缓存机制

简介: 字节跳动企业题库,链表系列,我们从出题频率最高刷到最低,题目有 23. 合并K个有序链表

image.png

前言:📫 作者简介:小明java问道之路,专注于研究计算机底层,就职于金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的设计和架构📫

🏆 Java领域优质创作者、阿里云专家博主、华为云享专家🏆

🔥 如果此文还不错的话,还请👍关注点赞收藏三连支持👍一下博主哦

本文导读

字节跳动企业题库,链表系列,因为有leetcode会员能看到企业出题频率,那我们从出题频率最高刷到最低,题目有 23. 合并K个有序链表


23. 合并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 = [[]] 输出:[]

【暴力、递归、迭代】图解:

image.png


代码详解,逐行注释:

/*** 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; }* }*/classSolution {
/*K 指针:K 个指针分别指向K条链表;每次O(K)比较K个指针min, 时间复杂度O(NK)*/publicListNodemergeKLists(ListNode[] lists) { 
intk=lists.length;
ListNodedummyHead=newListNode(0);
ListNodetail=dummyHead;
while (true) {
ListNodeminNode=null;
intminPointer=-1;
for (inti=0; i<k; i++) {
if (lists[i] ==null) {
continue;
                }
if (minNode==null||lists[i].val<minNode.val) {
minNode=lists[i];
minPointer=i;
                }
            }
if (minPointer==-1) {
break;
            }
tail.next=minNode;
tail=tail.next;
lists[minPointer] =lists[minPointer].next;
        }
returndummyHead.next;
    }
}

image.gif


classSolution {
/*两两合并 - 迭代*/publicListNodemergeKLists(ListNode[] lists) {
if (lists.length==0) {
returnnull;
        }
intk=lists.length;
while (k>1) {
intidx=0;
for (inti=0; i<k; i+=2) {
if (i==k-1) {
lists[idx++] =lists[i];
                } else {
lists[idx++] =merge2Lists(lists[i], lists[i+1]);
                }
            }
k=idx;
        }
returnlists[0];
    }
}
classSolution {
/*两两合并 - 递归*/publicListNodemergeKLists(ListNode[] lists) {
if (lists.length==0) {
returnnull;
        }
returnmerge(lists, 0, lists.length-1);
    }
privateListNodemerge(ListNode[] lists, intlo, inthi) {
if (lo==hi) {
returnlists[lo];
        }
intmid=lo+ (hi-lo) /2;
ListNodel1=merge(lists, lo, mid);
ListNodel2=merge(lists, mid+1, hi);
returnmerge2Lists(l1, l2);
    }
}

image.gif


相关文章
|
7天前
|
缓存 Java 数据库连接
MyBatis缓存机制
MyBatis提供两级缓存机制:一级缓存(Local Cache)默认开启,作用范围为SqlSession,重复查询时直接从缓存读取;二级缓存(Second Level Cache)需手动开启,作用于Mapper级别,支持跨SqlSession共享数据,减少数据库访问,提升性能。
18 1
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
2月前
|
存储 缓存 算法
经典算法之链表篇(三)
经典算法之链表篇(三)
|
2月前
|
算法
经典算法之链表篇(二)
经典算法之链表篇(二)
|
2月前
|
算法 索引
经典算法之链表篇
经典算法之链表篇
|
2月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
32 0
|
6月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
6月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
6月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
60 2