力扣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);

图片版:

相关推荐
会飞的架狗师几秒前
【MySQL体系】第1篇:从MySQL架构原理到存储的解析
后端·mysql
用户835629078051几秒前
用Python高效处理Excel数据:Excel数据读取指南
后端·python
IT技术小密圈3 分钟前
图解系统设计: 五分钟从单体架构到微服务(上)
后端
mudtools6 分钟前
.NET驾驭Word之力:COM组件二次开发全攻略之连接Word与创建你的第一个自动化文档
后端·c#
文心快码BaiduComate7 分钟前
“一人即团队”——一句话驱动智能体团队
前端·后端·程序员
bobz96514 分钟前
kubeovn with metallb:service externalTraffcLocal
后端
Aerfajj21 分钟前
从零开始搭建一个新的项目,需要配置哪些东西
面试
小枫编程21 分钟前
Spring Boot 与前端文件上传跨域问题:Multipart、CORS 与网关配置
前端·spring boot·后端
我星期八休息23 分钟前
深入理解跳表(Skip List):原理、实现与应用
开发语言·数据结构·人工智能·python·算法·list
lingran__24 分钟前
速通ACM省铜第四天 赋源码(G-C-D, Unlucky!)
c++·算法