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个一组反转链表

avatar
  1. 是否剩余k个

  2. 内部指向反转

  3. 头尾指向调整

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 - 串联所有单词的字串

avatar

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

2. 字符串哈希版 o(n)

Last updated