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

图片版:

相关推荐
Kookoos19 分钟前
【实战】基于 ABP vNext 构建高可用 S7 协议采集平台(西门子 PLC 通信全流程)
后端·物联网·c#·.net
帮帮志22 分钟前
vue3与springboot交互-前后分离【完成登陆验证及页面跳转】
spring boot·后端·交互
软件测试媛25 分钟前
软件测试——面试八股文(入门篇)
软件测试·面试·职场和发展
牛马baby32 分钟前
Java高频面试之并发编程-17
java·开发语言·面试
强盛小灵通专卖员3 小时前
分类分割详细指标说明
人工智能·深度学习·算法·机器学习
IT猿手6 小时前
基于强化学习 Q-learning 算法求解城市场景下无人机三维路径规划研究,提供完整MATLAB代码
神经网络·算法·matlab·人机交互·无人机·强化学习·无人机三维路径规划
万能程序员-传康Kk9 小时前
旅游推荐数据分析可视化系统算法
算法·数据分析·旅游
PXM的算法星球9 小时前
【并发编程基石】CAS无锁算法详解:原理、实现与应用场景
算法
ll7788119 小时前
C++学习之路,从0到精通的征途:继承
开发语言·数据结构·c++·学习·算法
烨然若神人~9 小时前
算法第十七天|654. 最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
算法