【leetcode】数组、链表高频题目集合

224 阅读2分钟

数组

枚举

  • 【1249】移除无效的括号:从左向右,再从右向左,标记无效括号

逆序

l,r双指针实现反转

  • 【189】轮转数组:滚动平移k位,相当于反转0len-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】链表排序:

    • 归并:切分(链表中点)+合并