力扣hot100二刷——链表

第二次刷题不在idea写代码,而是直接在leetcode网站上写,"逼"自己掌握常用的函数。

标志 掌握程度 解释 办法
Fully 完全掌握 看到题目就有思路,编程也很流利
⭐⭐ Basically 基本掌握 需要稍作思考,或者看到提示方法后能解答
⭐⭐⭐ Slightly 稍微掌握 需要看之前写过的代码才能想起怎么做 多做
⭐⭐⭐⭐ absolutely no 完全没有掌握 需要看题解才知道怎么做
⭐⭐⭐⭐⭐ 有难度的高频题 需要看题解才知道怎么做,而且过几天就忘了这道题怎么做了 背背
22 ⭐⭐ Easy 链表 160/相交链表 哈希表法,时间复杂度始终是O(M+N) 双指针法,时间复杂度最差是O(M+N),指针A遍历完链表A再接着遍历链表B;指针B遍历完链表A再遍历链表A,两者走了相同距离时,即为答案(相交节点或者空节点)
23 Easy 链表 206/反转链表 定义三个指针:lastNode curNode nextNode,curNode 从头节点开始遍历直到curtNode == null时结束遍历 ListNode lastNode = null;
24 ⭐⭐⭐ Easy 链表 234/回文链表 错误的思路:先翻转链表,再比较翻转前后的链表,这样做翻转前的链表已经不存在了,没法比较 正确思路:快慢指针先找到链表的中点,然后反转后半段链表,再比较链表的前半段和后半段
25 Easy 链表 141/环形链表 易错点:首先要排除输入为null的情况:if(head == null) return null; 快慢指针遍历链表,如果两指针相同则存在环形
26 ⭐⭐ Medium 链表 142/环形链表II 在141题的基础上,多加一部即可 快慢指针相遇,证明有环 快指针指向头节点,慢指针不变,两指针同时向后移动,直至相遇即为环节点
27 ⭐⭐⭐ Easy 链表 21/合并两个有序链表 思路很简单,但程序有细节要注意 定义两个指针,分别指向两个链表的头节点 当两个指针所指节点均不为空时,比较它们的大小,谁小就加在新链表后,并且后移该指针 跳出循环后,可能两条链表的节点都被加入新链表了,也有可能有一条链表还有节点没被加入新链表,所以要手动判断并加入。
28 Medium 链表 2/两数相加 要注意,判断最后的进位是否 > 0,> 0的话,链表最后再加上这个进位 对应位相加(要判断,节点是否为空,为空的话相当于加 0) 求出当前节点的值:(进位 + 节点1的值 + 节点2的值)% 10 更新进位:(进位 + 节点1的值 + 节点2的值)/ 10 记得后移指针
29 ⭐⭐⭐ Medium 链表 19/删除链表的倒数第N个节点 定义快慢指针,快指针比慢指针快n个节点。 要注意的是,如果快指针到达队尾,说明要删的恰好是头节点,那么直接返回第二个节点 快慢指针向后移,直到快指针到达尽头(下个节点为空),此时要删的就是慢指针的下个节点
30 ⭐⭐⭐ Medium 链表 24/两两交换链表中的节点 哨兵节点+遍历链表的同时交换相邻节点 创建一个哨兵节点,并维护pre、cur、next三个节点 当pre.nextnull&&pre.next.nextnull 时,遍历链表,并交换节点。 程序开始先排除head == null || head.next == null的情况
31 ⭐⭐⭐⭐ Hard 链表 25/K个一组反转链表 把链表分为三部分:已经反转的、要反转的、未反转的 找到此次要反转的部分的尾节点end,并把尾节点的下个节点置空;end.next == null ,结束遍历 反转此部分链表(重点) 将该部分链表加到已经反转部分的后面
32 ⭐⭐⭐ Medium 链表 138/随机链表的复制 使用哈希表来保存节点 遍历链表,将节点保存到哈希表Map<Node, Node> 再次遍历链表,将原节点中的next、random拷贝到新节点中
33 ⭐⭐⭐⭐ Medium 链表 148/排序链表 归并排序 快慢指针将链表分为两半,一半为left,一半为right,如果head == null || head.next == null说明不可以再分了,就结束递归 left链表和right链表进行比较排序并合并,算法如21题。 最后要将不为空的节点加入到链表最后,再返回头节点。
34 ⭐⭐⭐ Hard 链表 23/合并k个升序链表 升序的优先级队列 PriorityQueue 遍历数组,将每个链表的头节点加入到队列中 当队列不为空时,循环执行以下操作 2.1 移除队头节点(最小节点) 2.2 将该节点的下一个节点加入到队列(如果不为null的话)
35 ⭐⭐⭐⭐⭐ Medium 链表 146/LRU缓存 双向链表+哈希表 哈希表保存<key, Node>,便于查找key 建立双向链表类与dummy哨兵节点 LRUCache(int capacity) 初始化容量、dummy节点的pre和next get操作 getKey()函数查找key是否存在,存在则返回value,否则返回-1; put操作 getKey()函数查找key是否存在,存在则更改原来的value为新的value;否则putFront()函数将key加入到最前面,并且要判断是否超出容量,超出的话要remove()删除尾节点 getkey() 查找哈希表中是否存在key,存在则putFront()函数将该节点加入到最前面,并返回Node,否则返回null putFront() 将节点加入到最前面,也就是dummy的后面 remove() 删除尾节点,也就是dummy的前面 PriorityQueue pq = new PriorityQueue<>((a,b) -> a.val - b.val);

图片版:

相关推荐
飞川撸码41 分钟前
【LeetCode 热题100】网格路径类 DP 系列题:不同路径 & 最小路径和(力扣62 / 64 )(Go语言版)
算法·leetcode·golang·动态规划
Neil今天也要学习1 小时前
永磁同步电机参数辨识算法--IPMSM拓展卡尔曼滤波全参数辨识
单片机·嵌入式硬件·算法
yzx9910132 小时前
基于 Q-Learning 算法和 CNN 的强化学习实现方案
人工智能·算法·cnn
亮亮爱刷题2 小时前
算法练习-回溯
算法
眼镜哥(with glasses)3 小时前
蓝桥杯 国赛2024python(b组)题目(1-3)
数据结构·算法·蓝桥杯
coderSong25685 小时前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
Mr_Air_Boy6 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
咖啡啡不加糖7 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
int型码农7 小时前
数据结构第八章(一) 插入排序
c语言·数据结构·算法·排序算法·希尔排序
大鸡腿同学8 小时前
纳瓦尔宝典
后端