Week 03 - Leetcode 21 - 30
21 - 合并两个有序链表
二路归并
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
// 双指针
ListNode* dummy = new ListNode(0), *cur = dummy;
while(l1 && l2)
{
if(l1->val < l2->val)
cur->next = l1, l1 = l1->next;
else
cur->next = l2, l2 = l2->next;
cur = cur->next;
}
ListNode* l = l1 ? l1 : l2;
while(l)
{
cur = cur->next = l;
l = l->next;
}
return dummy->next;
}
};22 - 括号生成
括号序合法的充分必要条件是左括号数量大于等于右括号的数量 (卡特兰数)
23 - 合并K个升序链表
K路归并, 用堆找最小值;
Note: 在C++中, 优先队列传入自定义的比较函数是传入一个自定义的Struct 重载括号
24 - 两两交换链表中的节点
这种链表题在纸上画一画指针是怎么倒腾的;
25 - K个一组反转链表

是否剩余k个
内部指向反转
头尾指向调整
26 - 删除排序数组中的重复项
C++ 中 unique函数的实现 遇到和前一个元素不一样的,就记录到k指的位置;
27 - 移除元素
和上一题一样
28 - 实现strStr()
复习一下KMP (永远记不住KMP)🆘 KMP的数组下标从1开始 定义 ne[1] = 0, ne[i] 表示p[1...i]前后缀中最长重叠的长度(不算自己)...; 背一下下面的这个 1. 求ne数组
2. KMP匹配
29 - 两数相除
只能用加减法.. 快速幂的思想 复习一下快速幂
这里快速幂是乘法-从小到大,除法反过来从大到小枚举 这里边界情况还很多的 尤其要注意的是溢出问题 比如 int -2^31取模就会溢出 所以abs的时候要强转 1 << i 这里是先按int左移 如果超>= 32位就会溢出 实际会按照 i% 32 进行位移
30 - 串联所有单词的字串

这里的额外复杂度是substr操作所带来的, C++17中引入的std::string_view可以一定程度上解决这个问题; string_view sv = s 1. substr版 o(w*n)
2. 字符串哈希版 o(n)
Last updated