链表:7. 链表相交(面试02.07) 8. 环形链表II(142)
哈希表:6. 四数相加II(454) 8.三数之和(15) 9. 四数之和(18)
字符串
双指针法
2026
1.23
数组
-
关于 >=/medal±1 的判断
关于能取到的范围, target 所在范围:
- 若 [left,right],则 right 初始化为len-1,
while(left<=right); media > target 时,right = media-1;media < target 时,left = media + 1- 若 [left,right),则 right 初始化为 len,
while(left<right); media > target 时,right = media;media < target 时,left = media + 1
- 若 [left,right),则 right 初始化为 len,
- 若 [left,right],则 right 初始化为len-1,
-
59. 螺旋矩阵II
关于边界条件、循环不变式的确定。- 54. 螺旋矩阵
- 避免单行/列重复遍历
- 按层遍历,收缩边界
- 54. 螺旋矩阵
快慢指针
-
-
快慢指针 O(n)
slow代表下标, fast代表查询到的元素。遍历 fast 到 len
-
相对指针
最开始的思路,left指针检测当前 nums[left] == val,
- 如果是,就把 right 的值覆盖
- 如果不是,就后移
在最开始和每一次覆盖之后,把所有 nums[right] == val 的值排除掉
-
while(大循环){ while(小循环)每次把特殊情况处理完 }
-
844. 比较含退格的字符串 最后的比较需要优化 / stack方法
-
283. 移动零 只遍历一遍数组
-
997.有序数组的平方 此题争议较大(原数组上怎么实现)
-
19. 删除链表的倒数第 N 个结点 ① 一次遍历法(最优解):快指针先走 N 步,快慢指针再一起走,直到快指针到达null
② 两次遍历法:第一遍确定总个数 len,再 len-n 求出需要进行操作的节点序号(删除的前一个节点)。要添加 dummy 虚拟头节点。 -
160. 相交链表 计算两链表长度的差值,
滑动窗口
找连续字串、数组的最小/最好字串、子数组
暴力解法会把数组嵌套遍历两遍,时间复杂度O(n^2);
滑动窗口的思想是直接把数组遍历两遍,时间复杂度O(2n)
- 3. 无重复字符的最长子串
HashMap存储区间内字母所在的位置;
对于每次检测的字符:- 存在区间内 (idx>l),把 l更新为idx+1
- 不存在区间内,不含重复字符的数组长度 length++
- 904. 水果成篮
含有1/2个不同数字的 最长连续子数组 长度。 - 209. 长度最小的子数组 每一轮迭代,将 nums[r] 加到sum,如果 sum ≥ target,则更新 l,更新子数组的最小长度,l不断右移到 sum<target
链表
-
203. 移除链表元素
①移除头节点 head 和移除其他节点有区别,②Solution:添加虚拟头节点
① 头节点while(head!=null && head.val==val) {head = head.next;}其他节点,连续target值的处理
ListNode cur = head;while(cur!=null && cur.next !=null) {if(cur.next.val == val){cur.next = cur.next.next; //处理连续target值} else {cur = cur.next;}}② 虚拟头节点(哨兵)
ListNode dumpy = new ListNode();dumpy.next = head; -
反转链表 易
-
两两交换链表中的节点
添加虚拟头节点 :操作当前节点,至少要指向当前的前一个节点
① 做的复杂化了,是递归假象的 while 循环,优化:一次循环只交换一对
② 递归 很巧妙(跪)
快慢指针
哈希表/散列表
- 242. 有效的字母异位词 桶计数法。
- 349. 两个数组的交集
数据类型的转换,Set
→ int[]
包装类型流 转化为 基本数据类型数组:包装类型流 → 基本类型流 → 基本类型数组res.stream().mapToInt(Integer::intValue).toArray(); - 202. 快乐数 hash 空间复杂度是 O(n);改用快慢指针,空间复杂度O(1).
- 1. 两数之和
字符串
- 344. 反转字符串
- 541. 反转字符串II
- 28. 找出字符串中第一个匹配项的下标 strStr()
👆很简单的模拟题,但T28值得一提的 KMP算法 - 替换数字
- 151. 反转字符串中的单词 Java中的 split 两个string之间的空格>1,会多增加一个空单词("") 删除尾部空格 s.strim();
- [] 459. 重复的子字符串
KMP
- 对于两个字符数组的遍历
- string[i] == patt[j] 时,i++ j++;
- 否则当 j>0 时,
j=next[j-1]指向前一个匹配的 next数值(可以跳过的匹配位数) - 否则,patt第一个字符就无法匹配,i++

- next数组
匹配失败时,返回最后一个匹配字符,next代表子串中“相同前后缀的长度”
二叉树
- 1022. 从根到叶的二进制数之和
dfs + 递归 - []