hot100之链表下
K个一组翻转链表(025)
先看代码
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(-1, head);
ListNode prev = dummy;
while(prev.next != null){
ListNode curr = reverse(prev, k);
if (curr == null){
reverse(prev, k);
break;
}
prev = curr;
}
return dummy.next;
}
private ListNode reverse(ListNode prev, int k){
ListNode curr = prev.next;
int i = 1;
for (;i < k && curr.next != null; i++){
ListNode next = curr.next;
curr.next = next.next;
next.next = prev.next;
prev.next = next;
}
return i < k ? null : curr;
}
}
- 分析
重点在 reverse 部分
全局上prev 不动一直指向k个一组的起始部分, curr移动到k个一组末尾
单次中prev指向curr 指向的后一个节点, curr 向后移动
随机链表的复制(138)
先看代码
class Solution {
public Node copyRandomList(Node head) {
if (head == null){
return null;
}
Map<Node, Node> map = new HashMap<>();
Node curr = head;
while (curr != null){
map.put(curr, new Node(curr.val));
curr = curr.next;
}
curr = head;
while (curr != null){
map.get(curr).next = map.get(curr.next);
map.get(curr).random = map.get(curr.random);
curr = curr.next;
}
return map.get(head);
}
}
- 分析
题目的要求是要<深拷贝>一组链表(要求各节点地址不同)
难点在于以node.next为方向node.random 可能会指向未初始化节点
所以我们要先一步初始化复制的链表, 再在之后的遍历中把新node进一步拷贝
如何最高效的进一步拷贝node呢, 有O(1)的复杂度就好了, 是什么呢, 好难猜啊
排序链表(148)
先看代码
class Solution {
public ListNode sortList(ListNode head) {
if (head == null || head.next == null){
return head;
}
ListNode fast = head.next, slow = head;
while (fast.next != null){
fast = fast.next;
slow = slow.next;
if (fast.next != null){
fast = fast.next;
}
}
ListNode temp = slow.next;
slow.next = null;
ListNode lef = sortList(head);
ListNode rig = sortList(temp);
ListNode dummy = new ListNode(-1);
ListNode res = dummy;
while (lef != null && rig != null){
if (lef.val < rig.val){
dummy.next = lef;
lef = lef.next;
}else{
dummy.next = rig;
rig = rig.next;
}
dummy = dummy.next;
}
dummy.next = lef!=null ? lef : rig;
return res.next;
}
}
- 分析
根排序数组一样, 二分→排序→合并
- 踩坑
快慢指针在面对长度为2的链表, 没有快慢区分度 需要ListNode fast = head.next 让快指针先走一步
合并K个升序链表(023)
先看代码
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
return mergeKLists(lists, 0, lists.length);
}
private ListNode mergeKLists(ListNode[] lists, int i, int j){
int m = j - i;
if (m == 0) return null;
if (m == 1) return lists[i];
ListNode lef = mergeKLists(lists, i, i + m/2);
ListNode rig = mergeKLists(lists, i + m/2, j);
return mergeTwoList(lef, rig);
}
private ListNode mergeTwoList() //实现同合并两个有序链表
- 分析
同样, 先对k个链表进行 K分→二分→排序→合并→K合
LRU缓存(146)
先看代码
代码有点长 ,就不看了就看个总体吧
private static class Node {
int key, val;
Node prev, next;
Node (int k, int v){
key = k;
val = v;
}
}
private final int capacity;
private final Node dummy = new Node(0,0);
private final Map<Integer, Node> keyToNode = new HashMap<>();
- 分析
通过 HashMap保证O(1)的增删改查 链表来排序节点的新旧
利用prev, next 形成以dummy 为介质的环形链表
hot100之链表下的更多相关文章
- Chapter07 链表(下):如何轻松学出正确的链表代码?
技巧一:理解指针或引用的含义 技巧二:指针丢失和内存泄漏 技巧三:利用哨兵简化实现难度 技巧四:重点留意边界条件处理 如果链表未空时,代码是否能够正常运行 如果链表只包含一个节点时,代码能否正常运行 ...
- linux下bus、devices和platform的基础模型
转自:http://blog.chinaunix.net/uid-20672257-id-3147337.html 一.kobject的定义:kobject是Linux2.6引入的设备管理机制,在内核 ...
- c++链表归并排序的迭代版本
之前用js写了个归并排序非递归版,而这一次,c++封装链表的时候也遇到了一个归并排序的接口.邓老师实现了递归版本的归并排序,但是递归的调用函数栈的累积是很占内存空间的.于是乎,那试试在链表结构上实现以 ...
- linux下i2c驱动笔记 转
1. 几个基本概念 1.1. 设备模型 由 总线(bus_type) + 设备(device) + 驱动(device_driver) 组成,在该模型下,所有的设备通过总线连接起来,即使有些设备没有连 ...
- java实现链表结构
1. 定义节点node public class Node<T> { private Node<T> pre; private Node<T> next; priv ...
- Java学习笔记--链表
心在山东身在吴,飘蓬江海漫嗟吁. 他时若遂凌云志, 敢笑黄巢不丈夫. --水浒传 先上源代码,LinkedList类: private static class Node<E> { E i ...
- 用js来实现那些数据结构07(链表01-链表的实现)
前面讲解了数组,栈和队列.其实大家回想一下.它们有很多相似的地方.甚至栈和队列这两种数据结构在js中的实现方式也都是基于数组.无论增删的方式.遵循的原则如何,它们都是有序集合的列表.在js中,我们新建 ...
- c语言——单链表分拆——头插法创建链表,尾插法生成链表
#if 1 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; ...
- C和C指针小记(十七)-使用结构和指针-链表
1.链表 链表(linked list)即使是一些包含数据的独立数据结构的(Node)集合. 链表中的每个节点通过链或指针链接在一起. 程序通过指针访问链表中的节点. 节点通常是动态分配的,但也有由节 ...
- 剑指Offer——从尾到头打印链表
题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 分析: 方法1:利用栈的性质,先从头到尾遍历链表每个节点的值存入栈中,最后一个一个出栈顺序便是从尾到头的. 方法2:直接从头到尾遍历链表存储节 ...
随机推荐
- 我最常用的 Visual Studio 2022 扩展插件推荐:生产力必备工具
Visual Studio 2022作为微软推出的一款功能强大的IDE,业界称之为"宇宙第一IDE".它以出色的性能.丰富的内置功能和对多种编程语言的支持,深受开发者喜爱.然而,随 ...
- nacos(九):sentinel——规则持久化
接上回,sentinel基本使用我们已经掌握.但是在设置限流规则时,会发现规则都是临时的,一段时间没访问资源或者重启sentinel,规则就会消失.所以,我们需要有一个将规则持久化保存的地方,让规则一 ...
- JMeter跨线程传参总结
- (转)python批量提取PDF第一页输出为图片
一:步骤 1.使用input输入路径 2.生成图片存户路径同存放路径 3.生成图片为PNG格式 4.支持自定义截取页数,建议为第一页 二:安装扩展类 pip install PyMuPDF 三:示例代 ...
- 如何0基础学stm32?
如何0基础学stm32? 作为一个混迹嵌入式领域十余年的老兵,每次看到"0基础学STM32"这样的提问,我都忍不住想笑,又有些无奈.这就像问"如何0基础学开飞机" ...
- c#运算符重载(operator)
适用范围:C# 7.0及以上版本 C#学习-运算符重载(operator) - 百度文库 (baidu.com) 官网文档:Operator overloading - C# reference | ...
- 揭秘AI自动化框架Browser-use(终):利用MCP与Spring AI,3行代码复刻Browser-use实现
技术背景与目标 在前几篇文章中,我们深入解析了Browser-use框架的核心机制,包括DOM树遍历与分析.提示词构造.任务分解与规划.以及浏览器操作的函数调用.我们将通过Spring AI和Play ...
- http2和http3
HTTP/2 和 HTTP/3 是 HTTP 协议的升级版本,主要为了解决 HTTP/1.x 协议的性能瓶颈和安全性问题.以下是它们的主要目标和解决的问题: HTTP/2 的主要目标和解决的问题 1. ...
- <HarmonyOS第一课13>给应用添加通知和提醒 #鸿蒙课程##鸿蒙生态#
课程介绍 <HarmonyOS第一课:给应用添加通知和提醒>将引导开发者如何在HarmonyOS应用中实现通知功能.课程首先介绍如何为您的应用添加基础类型通知,包括普通文本.多行文本和图片 ...
- HarmonyOS运动开发:如何集成百度地图SDK、运动跟随与运动公里数记录
前言 在开发运动类应用时,集成地图功能以及实时记录运动轨迹和公里数是核心需求之一.本文将详细介绍如何在 HarmonyOS 应用中集成百度地图 SDK,实现运动跟随以及运动公里数的记录. 一.集成百度 ...