记录一下几道常见的leetcode题目的解法,都是比较基础的题目。
leetcode-21:合并两个有序链表
题目说明:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
解题思路:迭代
可以同时遍历两个链表,对比他们的当前节点值,将较小的节点拼接到新的链表,当较短的链表遍历完成,则结束遍历,将长链表剩余的部分拼接到新的链表。
1 | # Definition for singly-linked list. |
时间复杂度:O(n+m),n、m分别为两个链表的长度,因为遍历的总长度为两个链表的长度之和。
空间复杂度:O(1),只需要常数的空间存放若干变量。
leetcode-94:二叉树的中序遍历
题目说明:给定一个二叉树的根节点 root
,返回它的 中序 遍历。
解题思路一:递归
递归打印二叉树中序遍历的节点值。
1 | # Definition for a binary tree node. |
时间复杂度:O(n),n为二叉树节点个数,每个节点都会被访问一次。
空间复杂度:O(n),取决于栈深度,当二叉树为链式结构时,栈的深度为n。
解题思路二:迭代
用栈来实现递归中使用到的栈。
1 | # Definition for a binary tree node. |
时间复杂度:O(n),n为二叉树节点个数,每个节点都会被访问一次。
空间复杂度:O(n),取决于栈深度,当二叉树为链式结构时,栈的深度为n。
leetcode-104:二叉树的最大深度
题目说明:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
解题思路:递归
1 | # Definition for a binary tree node. |
时间复杂度:O(n),n为节点个数,二叉树每个节点都会被遍历一次。
空间复杂度:O(h),h为二叉树的高度,空间复杂度取决于二叉树的高度
leetcode-206:反转链表
题目说明:给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
解题思路一:迭代
运用Python解包赋值的方式,pre指向当前节点cur,pre.next指向前节点pre(注意,此时pre.next的pre已被赋值为cur,而后面的pre还是None),当前节点cur指向下一个节点cur.next
1 | # Definition for singly-linked list. |
时间复杂度:O(n),n为链表长度,每个链表都会被遍历一次。
空间复杂度:O(1)。
解题思路二:迭代
反转时,要先保存当前节点的下一个节点,防止其丢失。
1 | # Definition for singly-linked list. |
时间复杂度:O(n)。
空间复杂度:O(1)。
解题思路三:递归
递归可理解为先将链表递归到最后一个节点的前一个节点,结束递归时修改这个节点的指针进行操作。
1 | # Definition for singly-linked list. |
时间复杂度:O(n)。
空间复杂度:O(n),n为链表长度,递归深度最多为n层。
leetcode-226:翻转一颗二叉树
解题思路一:广度优先搜索
1 | # Definition for a binary tree node. |
时间复杂度:O(n),n为二叉树节点个数,因为每个节点都会入队出队一次。
空间复杂度:O(n),n为二叉树节点个数,最快情况为完全二叉树,每个叶子节点都会进队,二叉树叶子节点个数为n/2个,故空间复杂度为O(n)。
解题思路二:深度优先搜索
递归交换当前节点的左右子树,当前节点为空时结束递归。
1 | # Definition for a binary tree node. |
时间复杂度:O(n),每个节点在递归时都会访问一次。
空间复杂度:O(n),最坏情况是树成为链式结构,递归的深度为n。
leetcode-617:合并二叉树
题目说明:
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
解题思路:递归
有三种情况:
- 只有一个树的节点为空,重叠时返回另一个树结点
- 都为空则返回空
- 都不为空,创建新的树节点,合并两个树节点的值作为新节点的值,并递归的合并左右子树
1 | # Definition for a binary tree node. |
时间复杂度:O(min(n, m)),仅在两棵二叉树节点都不为空时才做合并处理,故被访问到的节点数不超过较小的二叉树节点数。
空间复杂度:O(min(n, m)),栈的深度为二叉树高度,递归的层数不会超过较小的二叉树的高度,最坏情况下树为链式结构,高度等于节点数。
leetcode-897:递增顺序搜索树
题目说明:给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
解题思路:中序遍历后生成新树
1 | # Definition for a binary tree node. |
时间复杂度:O(n),n为二叉树节点数,每个节点都会遍历两次,故为O(n)。
空间复杂度:O(n),n为二叉树节点数,需要长度为n的列表保存所有节点的值。
leetcode-938:二叉搜索树的范围和
题目说明:给定二叉搜索树的根结点 root
,返回值位于范围 [low, high]
之间的所有结点的值的和。
解题思路一:深度优先搜索
1 | # Definition for a binary tree node. |
时间复杂度:O(n)
空间复杂度:O(n)
解题思路二:广度优先搜索
1 | # Definition for a binary tree node. |
时间复杂度:O(n)
空间复杂度:O(n)
解题思路三:前序遍历求和
1 | # Definition for a binary tree node. |
时间复杂度:O(n)
空间复杂度:O(n)