LeetCode 160. 相交链表
160. 相交链表题目给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
自定义评测:
评测系统 的输入如下(你设计的程序 不适用 此输入):
intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0listA - 第一个链表listB - 第二个链表skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。
示例 1:
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3输 ...
LeetCode 189. 旋转数组
189. 旋转数组题目1234567891011121314151617181920212223242526272829303132给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 进阶:尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗? 示例 1:输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]示例 2:输入:nums = [-1,-100,3,99], k = 2输出:[3,99,-1,-100]解释: 向右旋转 1 步: [99,-1,-100,3]向右旋转 2 步: [3,99,-1,-100] 提示:1 <= nums.length <= 2 * 104-231 <= nums[i] <= 231 - 10 <= k <= 105
...
LeetCode 19 删除链表的倒数第 N 个结点
19 删除链表的倒数第 N 个结点题目给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:
输入:head = [1], n = 1输出:[]示例 3:
输入:head = [1,2], n = 1输出:[1]
提示:
链表中结点的数目为 sz1 <= sz <= 300 <= Node.val <= 1001 <= n <= sz
思路第一个思路就是,先遍历一遍,找到size,然后倒数k个节点就是size - k + 1,因为我们要移除这个节点,所以我们遍历到size-k的时候就可以,
时间负责度O(n)
第二个思路,我们快指针遍历k-1次,然后快慢指针同时遍历,当快指针遍历到末尾的时候,慢指针的指向的节点就是要移除的节点
实现遍历一遍找到size
需要考虑移除头节点的情况,这里我是用一个if判断,是否移除头节点
123456789101112131415161718192021222324252627private stat ...
LeetCode 199. 二叉树的右视图
199. 二叉树的右视图题目给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
12输入: [1,2,3,null,5,null,4]输出: [1,3,4]
示例 2:
12输入: [1,null,3]输出: [1,3]
示例 3:
12输入: []输出: []
提示:
二叉树的节点个数的范围是 [0,100]-100 <= Node.val <= 100
思路二叉树的层序遍历,每次遍历一层,遍历一层的时候我们那最后的节点
实现12345678910111213141516171819202122232425262728private static class Solution { public List<Integer> rightSideView(TreeNode root) { if (root == null) { return new ArrayList<>(); ...
LeetCode 1. 两数之和
1. 两数之和题目给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
123输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
12输入:nums = [3,2,4], target = 6输出:[1,2]
示例 3:
12输入:nums = [3,3], target = 6输出:[0,1]
提示:
12342 <= nums.length <= 104-109 <= nums[i] <= 109-109 <= target <= 109只会存在一个有效答案
思路第一个就是双重for循环
第二个就是我们使用一个map存储访问过的数据,第二个target-num[i] ,如果map中有这个数据,说 ...
LeetCode 102. 二叉树的层序遍历
102. 二叉树的层序遍历题目1234567891011121314151617181920给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层序遍历结果:[ [3], [9,20], [15,7]]
思路这个就是树的广度优先遍历,我们需要借助一个队列来保存我们的广度的节点,以便第一个节点访问过后,能够直接访问广度节点而不是再次回溯
实现时间复杂度:O(N)
空间复杂度:O(N)
12345678910111213141516171819202122232425262728293031323334private static class Solution { public List<List<Integer>> levelOrder(TreeNode root) { //记录最后的收集结果 List<List< ...
无题
103. 二叉树的锯齿形层序遍历
LeetCode 105. 从前序与中序遍历序列构造二叉树
105. 从前序与中序遍历序列构造二叉树题目给定一棵树的前序遍历 preorder 与中序遍历 inorder。请构造二叉树并返回其根节点。
示例 1:
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]Output: [3,9,20,null,null,15,7]示例 2:
Input: preorder = [-1], inorder = [-1]Output: [-1]
提示:
1 <= preorder.length <= 3000inorder.length == preorder.length-3000 <= preorder[i], inorder[i] <= 3000preorder 和 inorder 均无重复元素inorder 均出现在 preorderpreorder 保证为二叉树的前序遍历序列inorder 保证为二叉树的中序遍历序列
思路先根据先序遍历结果能拿到根节点,然后在中序遍历结果中寻找根节点的位置,中序遍历中根节点之前的数据都是左子树,根节点右边的数据都是右子树, ...
LeetCode 112. 路径总和
112. 路径总和题目给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。
叶子节点 是指没有子节点的节点。
示例 1:
12输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true
示例 2:
12输入:root = [1,2,3], targetSum = 5输出:false
示例 3:
12输入:root = [1,2], targetSum = 0输出:false
提示:
123树中节点的数目在范围 [0, 5000] 内-1000 <= Node.val <= 1000-1000 <= targetSum <= 1000
思路实现
LeetCode 124. 二叉树中的最大路径和
124. 二叉树中的最大路径和题目路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
示例 1:
输入:root = [1,2,3]输出:6解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6示例 2:
输入:root = [-10,9,20,null,null,15,7]输出:42解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
提示:
树中节点数目范围是 [1, 3 * 104]-1000 <= Node.val <= 1000
思路实现
LeetCode 121. 买卖股票的最佳时机
121. 买卖股票的最佳时机题目给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例 1:
1234输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
123输入:prices = [7,6,4,3,1]输出:0解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
提示:
1 <= prices.length <= 105
0 <= prices[i] <= 104
思路实现
LeetCode 141. 环形链表
141. 环形链表题目给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。
示例 1:
123输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
123输入:head = [1,2], pos = 0输出:true解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
123输入:head = [1], pos = -1输出:false解释:链表中没有环。
提示:
链表中节点的数目范围是 [0, 104]
-105 <= Node.val <= 105
pos 为 -1 或者链表中的一个 有效索引 。
思路快慢指 ...