链表
从尾打印链表:使用一个vector顺序装下链表,然后将vector逆序
反转链表:使用vector顺序装下链表,然后反向遍历vector从头开始更新链表的值
合并两个有序链表:创建一个链表头节点L,同时遍历A和B链表,将值小的优先后插L,最后将非空链表单独后插L
两个链表的第一个公共节点:计算两链表长度,长链表移动长度差个节点,返回节点
链表中环的入口节点:使用set,将遍历过的指针地址存入set,当碰到重复地址时便是入口节点
判断链表是否有环:使用快慢指针
链表中倒数最后K个节点:使用快慢指针,快指针移动k个节点,然后快慢指针同时移动,注意例外情况判断
删除链表中重复节点:判断两节点是否重复,若重复记录重复值temp,依次向后判断其他节点是否等于temp,是就挨个删除
二叉树的深度:
二叉树的第K个节点:定义全局变量记录遍历的节点个数,采用中序遍历判断是否访问到了第k个节点,缓存下来并返回
二叉树的镜像:直接前序遍历交换左右子树
从上向下大于二叉树:使用宽搜
用两个栈实现队列:入栈向stack1
入,出栈若stack2
为空,就向将stack1
元素全部压入stack2
栈中,再返回栈顶元素,若stack2
非空,直接返回stack2
栈顶元素
跳n级台阶有多少种跳法(1步,2步):从末尾向前跳
左旋字符串k次:K轮循环,每轮循环循环左移一个位置
字母异位词组合到一起:将每个单词字母从大到小排序,排序之火如果一样就属于字母异位词,存到key为排序之后的映射value中
最长连续子序列
思路:关键是找起点,判断当前值减一的值有没有
将列表存入unordered_set
去重,遍历unordered_set
,判断当前元素的 x 的 (x-1)
值是否在集合中,如果不在,则是连续序列起点,依次判断x+1,x+2,x+3
在不在集合中,从而算出最长连续子序列
盛水最多的容器
思路:双指针,用两枚指针指向两端,保证长最大,然后不断移动短的一边向中间靠拢,过程中记录下来最大面积
为什么移动短边:装多少水是由最短边决定的,为什么最短边移动,是因为如果长边移动,那么装的水可能会少,(因为由最短边决定,无论你长边移动后高度增加或者减少,都只能是装水量变少。)不可能会多。而如果移动最短边,那么有可能能够装更多的水。
有效括号
遇左括号入栈
遇右括号:栈空无效,栈顶括号不匹配无效,栈顶括号若匹配出栈,最后如果栈空有效
二叉树的层次遍历:每轮循环开始之前,统计队列元素个数,就是每层的节点个数