数组
枚举
- 【1249】移除无效的括号:从左向右,再从右向左,标记无效括号
逆序
l,r双指针实现反转
-
【189】轮转数组:滚动平移k位,相当于反转0
len-k-1、len-klen-1最后再反转整体
前缀和
- 【437】路径总和 III:前缀和+hash+树dfs
- 【560】和为 K 的子数组:前缀和+哈希
差分
归位法
数据范围1~n,归位到n[i]=i即可
-
【41】缺失的第一个正数:不断进行数据归位即可、【287】寻找重复数
-
【442】数组中重复的数据:归位后,查找不在位置上的数
-
【448】找到所有数组中消失的数字
重复拼接
环形或者前后有关系的情况,可以将两个nums数组拼接在一起计算
- 【503】下一个更大元素 II
链表
模板:链表逆序、链表中位、链表合并
链表基本的遍历
- 【2】两数相加
- 【19】删除链表的倒数第 N 个结点:双指针其中一个先走n步
- 【82】删除排序链表中的重复元素 II:遇到重复的就一口气全删掉
- 【86】分隔链表
- 【138】复制带随机指针的链表:在原链表右边创建一个副本,再分离出来
- 【160】相交链表:先计算两链表的长度,然后向右对齐,再枚举
- 【328】奇偶链表:相当于一分二再拼接
- 【707】设计链表
链表反转
// 反转后的链表头为pre
pre,p,next:=head,head.Next,head.Next.Next
for p!=nil {
p.Next = pre
pre,p = p,next
if next!=nil{
next = next.Next
}
}
// 递归写法
func reverseList(head *ListNode) *ListNode {
if head==nil || head.Next==nil{
return head
}
tail:=reverseList(head.Next)
head.Next.Next = head
head.Next = nil
return tail
}
-
【25】K 个一组翻转链表:反转前验证否够k个
-
【92】反转链表 II:反转第l到第r个
-
【143】重排链表:l0-l1-l2...->l0-ln-l1...
- 中位+反转+合并、中位+栈+合并
-
【206】反转链表
-
【24】两两交换链表中的节点:反转+递归
-
【445】两数相加 II:反转+相加+反转
链表合并
-
【21】合并两个有序链表:双指针合并、【offer 25】合并两个排序的链表
-
【148】链表排序:
- 归并:切分(链表中点)+合并