【算法社区】链表之合并两个有序链表、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


相关文章
|
15天前
|
缓存 应用服务中间件 nginx
Web服务器的缓存机制与内容分发网络(CDN)
【8月更文第28天】随着互联网应用的发展,用户对网站响应速度的要求越来越高。为了提升用户体验,Web服务器通常会采用多种技术手段来优化页面加载速度,其中最重要的两种技术就是缓存机制和内容分发网络(CDN)。本文将深入探讨这两种技术的工作原理及其实现方法,并通过具体的代码示例加以说明。
46 1
|
18天前
|
缓存 算法 前端开发
深入理解缓存淘汰策略:LRU和LFU算法的解析与应用
【8月更文挑战第25天】在计算机科学领域,高效管理资源对于提升系统性能至关重要。内存缓存作为一种加速数据读取的有效方法,其管理策略直接影响整体性能。本文重点介绍两种常用的缓存淘汰算法:LRU(最近最少使用)和LFU(最不经常使用)。LRU算法依据数据最近是否被访问来进行淘汰决策;而LFU算法则根据数据的访问频率做出判断。这两种算法各有特点,适用于不同的应用场景。通过深入分析这两种算法的原理、实现方式及适用场景,本文旨在帮助开发者更好地理解缓存管理机制,从而在实际应用中作出更合理的选择,有效提升系统性能和用户体验。
41 1
|
29天前
|
算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
|
17天前
|
存储 缓存 关系型数据库
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
27 0
|
24天前
|
存储 算法
【初阶数据结构篇】顺序表和链表算法题
此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
|
27天前
|
算法
【数据结构与算法】共享双向链表
【数据结构与算法】共享双向链表
10 0
|
27天前
|
算法
【数据结构与算法】双向链表
【数据结构与算法】双向链表
10 0
|
27天前
|
算法
【数据结构与算法】循环链表
【数据结构与算法】循环链表
10 0
|
27天前
|
存储 算法
【数据结构与算法】链表
【数据结构与算法】链表
15 0
|
3月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表