auto commit

This commit is contained in:
CyC2018 2019-05-14 22:56:30 +08:00
parent 1dd4d45e0a
commit cb20aadfef
14 changed files with 332 additions and 372 deletions

View File

@ -1,23 +1,14 @@
<!-- GFM-TOC -->
* [原理](#原理)
* [1. 正常实现](#1-正常实现)
* [2. 时间复杂度](#2-时间复杂度)
* [3. m 计算](#3-m-计算)
* [4. 未成功查找的返回值](#4-未成功查找的返回值)
* [5. 变种](#5-变种)
* [例题](#例题)
* [1. 求开方](#1-求开方)
* [2. 大于给定元素的最小元素](#2-大于给定元素的最小元素)
* [3. 有序数组的 Single Element](#3-有序数组的-single-element)
* [4. 第一个错误的版本](#4-第一个错误的版本)
* [5. 旋转数组的最小数字](#5-旋转数组的最小数字)
* [6. 查找区间](#6-查找区间)
* [1. 求开方](#1-求开方)
* [2. 大于给定元素的最小元素](#2-大于给定元素的最小元素)
* [3. 有序数组的 Single Element](#3-有序数组的-single-element)
* [4. 第一个错误的版本](#4-第一个错误的版本)
* [5. 旋转数组的最小数字](#5-旋转数组的最小数字)
* [6. 查找区间](#6-查找区间)
<!-- GFM-TOC -->
# 原理
## 1. 正常实现
**正常实现**
```text
Input : [1,2,3,4,5]
@ -42,11 +33,11 @@ public int binarySearch(int[] nums, int key) {
}
```
## 2. 时间复杂度
**时间复杂度**
二分查找也称为折半查找,每次都能将查找区间减半,这种折半特性的算法时间复杂度为 O(logN)。
## 3. m 计算
**m 计算**
有两种计算中值 m 的方式:
@ -55,14 +46,14 @@ public int binarySearch(int[] nums, int key) {
l + h 可能出现加法溢出,也就是说加法的结果大于整型能够表示的范围。但是 l 和 h 都为正数,因此 h - l 不会出现加法溢出问题。所以,最好使用第二种计算法方法。
## 4. 未成功查找的返回值
**未成功查找的返回值**
循环退出时如果仍然没有查找到 key那么表示查找失败。可以有两种返回值
- -1以一个错误码表示没有查找到 key
- l将 key 插入到 nums 中的正确位置
## 5. 变种
**变种**
二分查找可以有很多变种,变种实现要注意边界值的判断。例如在一个有重复元素的数组中查找 key 的最左位置的实现如下:
@ -103,9 +94,7 @@ l m h
当循环体退出时,不表示没有查找到 key因此最后返回的结果不应该为 -1。为了验证有没有查找到需要在调用端判断一下返回位置上的值和 key 是否相等。
# 例题
## 1. 求开方
# 1. 求开方
[69. Sqrt(x) (Easy)](https://leetcode.com/problems/sqrtx/description/)
@ -143,7 +132,7 @@ public int mySqrt(int x) {
}
```
## 2. 大于给定元素的最小元素
# 2. 大于给定元素的最小元素
[744. Find Smallest Letter Greater Than Target (Easy)](https://leetcode.com/problems/find-smallest-letter-greater-than-target/description/)
@ -177,7 +166,7 @@ public char nextGreatestLetter(char[] letters, char target) {
}
```
## 3. 有序数组的 Single Element
# 3. 有序数组的 Single Element
[540. Single Element in a Sorted Array (Medium)](https://leetcode.com/problems/single-element-in-a-sorted-array/description/)
@ -214,7 +203,7 @@ public int singleNonDuplicate(int[] nums) {
}
```
## 4. 第一个错误的版本
# 4. 第一个错误的版本
[278. First Bad Version (Easy)](https://leetcode.com/problems/first-bad-version/description/)
@ -239,7 +228,7 @@ public int firstBadVersion(int n) {
}
```
## 5. 旋转数组的最小数字
# 5. 旋转数组的最小数字
[153. Find Minimum in Rotated Sorted Array (Medium)](https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/description/)
@ -263,7 +252,7 @@ public int findMin(int[] nums) {
}
```
## 6. 查找区间
# 6. 查找区间
[34. Find First and Last Position of Element in Sorted Array](https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/)

View File

@ -1,28 +1,21 @@
<!-- GFM-TOC -->
* [原理](#原理)
* [1. 基本原理](#1-基本原理)
* [2. mask 计算](#2-mask-计算)
* [3. Java 中的位操作](#3-java-中的位操作)
* [例题](#例题)
* [统计两个数的二进制表示有多少位不同](#统计两个数的二进制表示有多少位不同)
* [数组中唯一一个不重复的元素](#数组中唯一一个不重复的元素)
* [找出数组中缺失的那个数](#找出数组中缺失的那个数)
* [数组中不重复的两个元素](#数组中不重复的两个元素)
* [翻转一个数的比特位](#翻转一个数的比特位)
* [不用额外变量交换两个整数](#不用额外变量交换两个整数)
* [判断一个数是不是 2 的 n 次方](#判断一个数是不是-2-的-n-次方)
* [判断一个数是不是 4 的 n 次方](#判断一个数是不是-4-的-n-次方)
* [判断一个数的位级表示是否不会出现连续的 0 和 1](#判断一个数的位级表示是否不会出现连续的-0-和-1)
* [求一个数的补码](#求一个数的补码)
* [实现整数的加法](#实现整数的加法)
* [字符串数组最大乘积](#字符串数组最大乘积)
* [统计从 0 \~ n 每个数的二进制表示中 1 的个数](#统计从-0-\~-n-每个数的二进制表示中-1-的个数)
* [1. 统计两个数的二进制表示有多少位不同](#1-统计两个数的二进制表示有多少位不同)
* [2. 数组中唯一一个不重复的元素](#2-数组中唯一一个不重复的元素)
* [3. 找出数组中缺失的那个数](#3-找出数组中缺失的那个数)
* [4. 数组中不重复的两个元素](#4-数组中不重复的两个元素)
* [5. 翻转一个数的比特位](#5-翻转一个数的比特位)
* [6. 不用额外变量交换两个整数](#6-不用额外变量交换两个整数)
* [7. 判断一个数是不是 2 的 n 次方](#7-判断一个数是不是-2-的-n-次方)
* [8. 判断一个数是不是 4 的 n 次方](#8--判断一个数是不是-4-的-n-次方)
* [9. 判断一个数的位级表示是否不会出现连续的 0 和 1](#9-判断一个数的位级表示是否不会出现连续的-0-和-1)
* [10. 求一个数的补码](#10-求一个数的补码)
* [11. 实现整数的加法](#11-实现整数的加法)
* [12. 字符串数组最大乘积](#12-字符串数组最大乘积)
* [13. 统计从 0 \~ n 每个数的二进制表示中 1 的个数](#13-统计从-0-\~-n-每个数的二进制表示中-1-的个数)
<!-- GFM-TOC -->
# 原理
## 1. 基本原理
**基本原理**
0s 表示一串 01s 表示一串 1。
@ -48,7 +41,7 @@ x ^ x = 0 x & x = x x | x = x
- \>\>\> n 为无符号右移,左边会补上 0。
- &lt;&lt; n 为算术左移,相当于乘以 2<sup>n</sup>
## 2. mask 计算
** mask 计算**
要获取 111111111将 0 取反即可,\~0。
@ -58,7 +51,7 @@ x ^ x = 0 x & x = x x | x = x
要得到 1 到 i 位为 0 的 mask只需将 1 到 i 位为 1 的 mask 取反,即 \~(1&lt;&lt;(i+1)-1)。
## 3. Java 中的位操作
**Java 中的位操作**
```html
static int Integer.bitCount(); // 统计 1 的数量
@ -66,9 +59,7 @@ static int Integer.highestOneBit(); // 获得最高位
static String toBinaryString(int i); // 转换为二进制表示的字符串
```
# 例题
## 统计两个数的二进制表示有多少位不同
# 1. 统计两个数的二进制表示有多少位不同
[461. Hamming Distance (Easy)](https://leetcode.com/problems/hamming-distance/)
@ -121,7 +112,7 @@ public int hammingDistance(int x, int y) {
}
```
## 数组中唯一一个不重复的元素
# 2. 数组中唯一一个不重复的元素
[136. Single Number (Easy)](https://leetcode.com/problems/single-number/description/)
@ -140,7 +131,7 @@ public int singleNumber(int[] nums) {
}
```
## 找出数组中缺失的那个数
# 3. 找出数组中缺失的那个数
[268. Missing Number (Easy)](https://leetcode.com/problems/missing-number/description/)
@ -161,7 +152,7 @@ public int missingNumber(int[] nums) {
}
```
## 数组中不重复的两个元素
# 4. 数组中不重复的两个元素
[260. Single Number III (Medium)](https://leetcode.com/problems/single-number-iii/description/)
@ -185,7 +176,7 @@ public int[] singleNumber(int[] nums) {
}
```
## 翻转一个数的比特位
# 5. 翻转一个数的比特位
[190. Reverse Bits (Easy)](https://leetcode.com/problems/reverse-bits/description/)
@ -230,7 +221,7 @@ private int reverseByte(byte b) {
}
```
## 不用额外变量交换两个整数
# 6. 不用额外变量交换两个整数
[程序员代码面试指南 P317](#)
@ -240,7 +231,7 @@ b = a ^ b;
a = a ^ b;
```
## 判断一个数是不是 2 的 n 次方
# 7. 判断一个数是不是 2 的 n 次方
[231. Power of Two (Easy)](https://leetcode.com/problems/power-of-two/description/)
@ -260,7 +251,7 @@ public boolean isPowerOfTwo(int n) {
}
```
## 判断一个数是不是 4 的 n 次方
# 8. 判断一个数是不是 4 的 n 次方
[342. Power of Four (Easy)](https://leetcode.com/problems/power-of-four/)
@ -280,7 +271,7 @@ public boolean isPowerOfFour(int num) {
}
```
## 判断一个数的位级表示是否不会出现连续的 0 和 1
# 9. 判断一个数的位级表示是否不会出现连续的 0 和 1
[693. Binary Number with Alternating Bits (Easy)](https://leetcode.com/problems/binary-number-with-alternating-bits/description/)
@ -305,7 +296,7 @@ public boolean hasAlternatingBits(int n) {
}
```
## 求一个数的补码
# 10. 求一个数的补码
[476. Number Complement (Easy)](https://leetcode.com/problems/number-complement/description/)
@ -360,7 +351,7 @@ public int findComplement(int num) {
}
```
## 实现整数的加法
# 11. 实现整数的加法
[371. Sum of Two Integers (Easy)](https://leetcode.com/problems/sum-of-two-integers/description/)
@ -374,7 +365,7 @@ public int getSum(int a, int b) {
}
```
## 字符串数组最大乘积
# 12. 字符串数组最大乘积
[318. Maximum Product of Word Lengths (Medium)](https://leetcode.com/problems/maximum-product-of-word-lengths/description/)
@ -409,7 +400,7 @@ public int maxProduct(String[] words) {
}
```
## 统计从 0 \~ n 每个数的二进制表示中 1 的个数
# 13. 统计从 0 \~ n 每个数的二进制表示中 1 的个数
[338. Counting Bits (Medium)](https://leetcode.com/problems/counting-bits/description/)

View File

@ -1,11 +1,11 @@
<!-- GFM-TOC -->
* [二分图](#二分图)
* [判断是否为二分图](#判断是否为二分图)
* [1. 判断是否为二分图](#1-判断是否为二分图)
* [拓扑排序](#拓扑排序)
* [课程安排的合法性](#课程安排的合法性)
* [课程安排的顺序](#课程安排的顺序)
* [1. 课程安排的合法性](#1-课程安排的合法性)
* [2. 课程安排的顺序](#2-课程安排的顺序)
* [并查集](#并查集)
* [冗余连接](#冗余连接)
* [1. 冗余连接](#1-冗余连接)
<!-- GFM-TOC -->
@ -13,7 +13,7 @@
如果可以用两种颜色对图中的节点进行着色,并且保证相邻的节点颜色不同,那么这个图就是二分图。
## 判断是否为二分图
## 1. 判断是否为二分图
[785. Is Graph Bipartite? (Medium)](https://leetcode.com/problems/is-graph-bipartite/description/)
@ -72,7 +72,7 @@ private boolean isBipartite(int curNode, int curColor, int[] colors, int[][] gra
常用于在具有先序关系的任务规划中。
## 课程安排的合法性
## 1. 课程安排的合法性
[207. Course Schedule (Medium)](https://leetcode.com/problems/course-schedule/description/)
@ -130,7 +130,7 @@ private boolean hasCycle(boolean[] globalMarked, boolean[] localMarked,
}
```
## 课程安排的顺序
## 2. 课程安排的顺序
[210. Course Schedule II (Medium)](https://leetcode.com/problems/course-schedule-ii/description/)
@ -193,7 +193,7 @@ private boolean hasCycle(boolean[] globalMarked, boolean[] localMarked, List<Int
并查集可以动态地连通两个点,并且可以非常快速地判断两个点是否连通。
## 冗余连接
## 1. 冗余连接
[684. Redundant Connection (Medium)](https://leetcode.com/problems/redundant-connection/description/)

View File

@ -1,17 +1,17 @@
<!-- GFM-TOC -->
* [字符串循环移位包含](#字符串循环移位包含)
* [字符串循环移位](#字符串循环移位)
* [字符串中单词的翻转](#字符串中单词的翻转)
* [两个字符串包含的字符是否完全相同](#两个字符串包含的字符是否完全相同)
* [计算一组字符集合可以组成的回文字符串的最大长度](#计算一组字符集合可以组成的回文字符串的最大长度)
* [字符串同构](#字符串同构)
* [回文子字符串个数](#回文子字符串个数)
* [判断一个整数是否是回文数](#判断一个整数是否是回文数)
* [统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数](#统计二进制字符串中连续-1-和连续-0-数量相同的子字符串个数)
* [1. 字符串循环移位包含](#1-字符串循环移位包含)
* [2. 字符串循环移位](#2-字符串循环移位)
* [3. 字符串中单词的翻转](#3-字符串中单词的翻转)
* [4. 两个字符串包含的字符是否完全相同](#4-两个字符串包含的字符是否完全相同)
* [5. 计算一组字符集合可以组成的回文字符串的最大长度](#5-计算一组字符集合可以组成的回文字符串的最大长度)
* [6. 字符串同构](#6-字符串同构)
* [7. 回文子字符串个数](#7-回文子字符串个数)
* [8. 判断一个整数是否是回文数](#8-判断一个整数是否是回文数)
* [9. 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数](#9-统计二进制字符串中连续-1-和连续-0-数量相同的子字符串个数)
<!-- GFM-TOC -->
# 字符串循环移位包含
# 1. 字符串循环移位包含
[编程之美 3.1](#)
@ -24,7 +24,7 @@ Return : true
s1 进行循环移位的结果是 s1s1 的子字符串,因此只要判断 s2 是否是 s1s1 的子字符串即可。
# 字符串循环移位
# 2. 字符串循环移位
[编程之美 2.17](#)
@ -37,7 +37,7 @@ Return "123abcd"
将 abcd123 中的 abcd 和 123 单独翻转,得到 dcba321然后对整个字符串进行翻转得到 123abcd。
# 字符串中单词的翻转
# 3. 字符串中单词的翻转
[程序员代码面试指南](#)
@ -48,7 +48,7 @@ Return "student a am I"
将每个单词翻转,然后将整个字符串翻转。
# 两个字符串包含的字符是否完全相同
# 4. 两个字符串包含的字符是否完全相同
[242. Valid Anagram (Easy)](https://leetcode.com/problems/valid-anagram/description/)
@ -79,7 +79,7 @@ public boolean isAnagram(String s, String t) {
}
```
# 计算一组字符集合可以组成的回文字符串的最大长度
# 5. 计算一组字符集合可以组成的回文字符串的最大长度
[409. Longest Palindrome (Easy)](https://leetcode.com/problems/longest-palindrome/description/)
@ -110,7 +110,7 @@ public int longestPalindrome(String s) {
}
```
# 字符串同构
# 6. 字符串同构
[205. Isomorphic Strings (Easy)](https://leetcode.com/problems/isomorphic-strings/description/)
@ -138,7 +138,7 @@ public boolean isIsomorphic(String s, String t) {
}
```
# 回文子字符串个数
# 7. 回文子字符串个数
[647. Palindromic Substrings (Medium)](https://leetcode.com/problems/palindromic-substrings/description/)
@ -170,7 +170,7 @@ private void extendSubstrings(String s, int start, int end) {
}
```
# 判断一个整数是否是回文数
# 8. 判断一个整数是否是回文数
[9. Palindrome Number (Easy)](https://leetcode.com/problems/palindrome-number/description/)
@ -195,7 +195,7 @@ public boolean isPalindrome(int x) {
}
```
# 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数
# 9. 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数
[696. Count Binary Substrings (Easy)](https://leetcode.com/problems/count-binary-substrings/description/)

View File

@ -1,14 +1,14 @@
<!-- GFM-TOC -->
* [用栈实现队列](#用栈实现队列)
* [用队列实现栈](#用队列实现栈)
* [最小值栈](#最小值栈)
* [用栈实现括号匹配](#用栈实现括号匹配)
* [数组中元素与下一个比它大的元素之间的距离](#数组中元素与下一个比它大的元素之间的距离)
* [循环数组中比当前元素大的下一个元素](#循环数组中比当前元素大的下一个元素)
* [1. 用栈实现队列](#1-用栈实现队列)
* [2. 用队列实现栈](#2-用队列实现栈)
* [3. 最小值栈](#3-最小值栈)
* [4. 用栈实现括号匹配](#4-用栈实现括号匹配)
* [5. 数组中元素与下一个比它大的元素之间的距离](#5-数组中元素与下一个比它大的元素之间的距离)
* [6. 循环数组中比当前元素大的下一个元素](#6-循环数组中比当前元素大的下一个元素)
<!-- GFM-TOC -->
# 用栈实现队列
# 1. 用栈实现队列
[232. Implement Queue using Stacks (Easy)](https://leetcode.com/problems/implement-queue-using-stacks/description/)
@ -48,7 +48,7 @@ class MyQueue {
}
```
# 用队列实现栈
# 2. 用队列实现栈
[225. Implement Stack using Queues (Easy)](https://leetcode.com/problems/implement-stack-using-queues/description/)
@ -85,7 +85,7 @@ class MyStack {
}
```
# 最小值栈
# 3. 最小值栈
[155. Min Stack (Easy)](https://leetcode.com/problems/min-stack/description/)
@ -126,7 +126,7 @@ class MinStack {
对于实现最小值队列问题,可以先将队列使用栈来实现,然后就将问题转换为最小值栈,这个问题出现在 编程之美3.7。
# 用栈实现括号匹配
# 4. 用栈实现括号匹配
[20. Valid Parentheses (Easy)](https://leetcode.com/problems/valid-parentheses/description/)
@ -159,7 +159,7 @@ public boolean isValid(String s) {
}
```
# 数组中元素与下一个比它大的元素之间的距离
# 5. 数组中元素与下一个比它大的元素之间的距离
[739. Daily Temperatures (Medium)](https://leetcode.com/problems/daily-temperatures/description/)
@ -186,7 +186,7 @@ public int[] dailyTemperatures(int[] temperatures) {
}
```
# 循环数组中比当前元素大的下一个元素
# 6. 循环数组中比当前元素大的下一个元素
[503. Next Greater Element II (Medium)](https://leetcode.com/problems/next-greater-element-ii/description/)

View File

@ -1,40 +1,40 @@
<!-- GFM-TOC -->
* [递归](#递归)
* [树的高度](#树的高度)
* [平衡树](#平衡树)
* [两节点的最长路径](#两节点的最长路径)
* [翻转树](#翻转树)
* [归并两棵树](#归并两棵树)
* [判断路径和是否等于一个数](#判断路径和是否等于一个数)
* [统计路径和等于一个数的路径数量](#统计路径和等于一个数的路径数量)
* [子树](#子树)
* [树的对称](#树的对称)
* [最小路径](#最小路径)
* [统计左叶子节点的和](#统计左叶子节点的和)
* [相同节点值的最大路径长度](#相同节点值的最大路径长度)
* [间隔遍历](#间隔遍历)
* [找出二叉树中第二小的节点](#找出二叉树中第二小的节点)
* [1. 树的高度](#1-树的高度)
* [2. 平衡树](#2-平衡树)
* [3. 两节点的最长路径](#3-两节点的最长路径)
* [4. 翻转树](#4-翻转树)
* [5. 归并两棵树](#5-归并两棵树)
* [6. 判断路径和是否等于一个数](#6-判断路径和是否等于一个数)
* [7. 统计路径和等于一个数的路径数量](#7-统计路径和等于一个数的路径数量)
* [8. 子树](#8-子树)
* [9. 树的对称](#9-树的对称)
* [10. 最小路径](#10-最小路径)
* [11. 统计左叶子节点的和](#11-统计左叶子节点的和)
* [12. 相同节点值的最大路径长度](#12-相同节点值的最大路径长度)
* [13. 间隔遍历](#13-间隔遍历)
* [14. 找出二叉树中第二小的节点](#14-找出二叉树中第二小的节点)
* [层次遍历](#层次遍历)
* [一棵树每层节点的平均数](#一棵树每层节点的平均数)
* [得到左下角的节点](#得到左下角的节点)
* [1. 一棵树每层节点的平均数](#1-一棵树每层节点的平均数)
* [2. 得到左下角的节点](#2-得到左下角的节点)
* [前中后序遍历](#前中后序遍历)
* [非递归实现二叉树的前序遍历](#非递归实现二叉树的前序遍历)
* [非递归实现二叉树的后序遍历](#非递归实现二叉树的后序遍历)
* [非递归实现二叉树的中序遍历](#非递归实现二叉树的中序遍历)
* [1. 非递归实现二叉树的前序遍历](#1-非递归实现二叉树的前序遍历)
* [2. 非递归实现二叉树的后序遍历](#2-非递归实现二叉树的后序遍历)
* [3. 非递归实现二叉树的中序遍历](#3-非递归实现二叉树的中序遍历)
* [BST](#bst)
* [修剪二叉查找树](#修剪二叉查找树)
* [寻找二叉查找树的第 k 个元素](#寻找二叉查找树的第-k-个元素)
* [把二叉查找树每个节点的值都加上比它大的节点的值](#把二叉查找树每个节点的值都加上比它大的节点的值)
* [二叉查找树的最近公共祖先](#二叉查找树的最近公共祖先)
* [二叉树的最近公共祖先](#二叉树的最近公共祖先)
* [从有序数组中构造二叉查找树](#从有序数组中构造二叉查找树)
* [根据有序链表构造平衡的二叉查找树](#根据有序链表构造平衡的二叉查找树)
* [在二叉查找树中寻找两个节点,使它们的和为一个给定值](#在二叉查找树中寻找两个节点,使它们的和为一个给定值)
* [在二叉查找树中查找两个节点之差的最小绝对值](#在二叉查找树中查找两个节点之差的最小绝对值)
* [寻找二叉查找树中出现次数最多的值](#寻找二叉查找树中出现次数最多的值)
* [1. 修剪二叉查找树](#1-修剪二叉查找树)
* [2. 寻找二叉查找树的第 k 个元素](#2-寻找二叉查找树的第-k-个元素)
* [3. 把二叉查找树每个节点的值都加上比它大的节点的值](#3-把二叉查找树每个节点的值都加上比它大的节点的值)
* [4. 二叉查找树的最近公共祖先](#4-二叉查找树的最近公共祖先)
* [5. 二叉树的最近公共祖先](#5-二叉树的最近公共祖先)
* [6. 从有序数组中构造二叉查找树](#6-从有序数组中构造二叉查找树)
* [7. 根据有序链表构造平衡的二叉查找树](#7-根据有序链表构造平衡的二叉查找树)
* [8. 在二叉查找树中寻找两个节点,使它们的和为一个给定值](#8-在二叉查找树中寻找两个节点,使它们的和为一个给定值)
* [9. 在二叉查找树中查找两个节点之差的最小绝对值](#9-在二叉查找树中查找两个节点之差的最小绝对值)
* [10. 寻找二叉查找树中出现次数最多的值](#10-寻找二叉查找树中出现次数最多的值)
* [Trie](#trie)
* [实现一个 Trie](#实现一个-trie)
* [实现一个 Trie用来求前缀和](#实现一个-trie用来求前缀和)
* [1. 实现一个 Trie](#1-实现一个-trie)
* [2. 实现一个 Trie用来求前缀和](#2-实现一个-trie用来求前缀和)
<!-- GFM-TOC -->
@ -42,7 +42,7 @@
一棵树要么是空树,要么有两个指针,每个指针指向一棵树。树是一种递归结构,很多树的问题可以使用递归来处理。
## 树的高度
## 1. 树的高度
[104. Maximum Depth of Binary Tree (Easy)](https://leetcode.com/problems/maximum-depth-of-binary-tree/description/)
@ -53,7 +53,7 @@ public int maxDepth(TreeNode root) {
}
```
## 平衡树
## 2. 平衡树
[110. Balanced Binary Tree (Easy)](https://leetcode.com/problems/balanced-binary-tree/description/)
@ -84,7 +84,7 @@ public int maxDepth(TreeNode root) {
}
```
## 两节点的最长路径
## 3. 两节点的最长路径
[543. Diameter of Binary Tree (Easy)](https://leetcode.com/problems/diameter-of-binary-tree/description/)
@ -117,7 +117,7 @@ private int depth(TreeNode root) {
}
```
## 翻转树
## 4. 翻转树
[226. Invert Binary Tree (Easy)](https://leetcode.com/problems/invert-binary-tree/description/)
@ -131,7 +131,7 @@ public TreeNode invertTree(TreeNode root) {
}
```
## 归并两棵树
## 5. 归并两棵树
[617. Merge Two Binary Trees (Easy)](https://leetcode.com/problems/merge-two-binary-trees/description/)
@ -164,7 +164,7 @@ public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
}
```
## 判断路径和是否等于一个数
## 6. 判断路径和是否等于一个数
[Leetcdoe : 112. Path Sum (Easy)](https://leetcode.com/problems/path-sum/description/)
@ -192,7 +192,7 @@ public boolean hasPathSum(TreeNode root, int sum) {
}
```
## 统计路径和等于一个数的路径数量
## 7. 统计路径和等于一个数的路径数量
[437. Path Sum III (Easy)](https://leetcode.com/problems/path-sum-iii/description/)
@ -232,7 +232,7 @@ private int pathSumStartWithRoot(TreeNode root, int sum) {
}
```
## 子树
## 8. 子树
[572. Subtree of Another Tree (Easy)](https://leetcode.com/problems/subtree-of-another-tree/description/)
@ -283,7 +283,7 @@ private boolean isSubtreeWithRoot(TreeNode s, TreeNode t) {
}
```
## 树的对称
## 9. 树的对称
[101. Symmetric Tree (Easy)](https://leetcode.com/problems/symmetric-tree/description/)
@ -309,7 +309,7 @@ private boolean isSymmetric(TreeNode t1, TreeNode t2) {
}
```
## 最小路径
## 10. 最小路径
[111. Minimum Depth of Binary Tree (Easy)](https://leetcode.com/problems/minimum-depth-of-binary-tree/description/)
@ -325,7 +325,7 @@ public int minDepth(TreeNode root) {
}
```
## 统计左叶子节点的和
## 11. 统计左叶子节点的和
[404. Sum of Left Leaves (Easy)](https://leetcode.com/problems/sum-of-left-leaves/description/)
@ -352,7 +352,7 @@ private boolean isLeaf(TreeNode node){
}
```
## 相同节点值的最大路径长度
## 12. 相同节点值的最大路径长度
[687. Longest Univalue Path (Easy)](https://leetcode.com/problems/longest-univalue-path/)
@ -385,7 +385,7 @@ private int dfs(TreeNode root){
}
```
## 间隔遍历
## 13. 间隔遍历
[337. House Robber III (Medium)](https://leetcode.com/problems/house-robber-iii/description/)
@ -409,7 +409,7 @@ public int rob(TreeNode root) {
}
```
## 找出二叉树中第二小的节点
## 14. 找出二叉树中第二小的节点
[671. Second Minimum Node In a Binary Tree (Easy)](https://leetcode.com/problems/second-minimum-node-in-a-binary-tree/description/)
@ -444,7 +444,7 @@ public int findSecondMinimumValue(TreeNode root) {
使用 BFS 进行层次遍历。不需要使用两个队列来分别存储当前层的节点和下一层的节点,因为在开始遍历一层的节点时,当前队列中的节点数就是当前层的节点数,只要控制遍历这么多节点数,就能保证这次遍历的都是当前层的节点。
## 一棵树每层节点的平均数
## 1. 一棵树每层节点的平均数
[637. Average of Levels in Binary Tree (Easy)](https://leetcode.com/problems/average-of-levels-in-binary-tree/description/)
@ -469,7 +469,7 @@ public List<Double> averageOfLevels(TreeNode root) {
}
```
## 得到左下角的节点
## 2. 得到左下角的节点
[513. Find Bottom Left Tree Value (Easy)](https://leetcode.com/problems/find-bottom-left-tree-value/description/)
@ -550,7 +550,7 @@ void dfs(TreeNode root) {
}
```
## 非递归实现二叉树的前序遍历
## 1. 非递归实现二叉树的前序遍历
[144. Binary Tree Preorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-preorder-traversal/description/)
@ -570,7 +570,7 @@ public List<Integer> preorderTraversal(TreeNode root) {
}
```
## 非递归实现二叉树的后序遍历
## 2. 非递归实现二叉树的后序遍历
[145. Binary Tree Postorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-postorder-traversal/description/)
@ -593,7 +593,7 @@ public List<Integer> postorderTraversal(TreeNode root) {
}
```
## 非递归实现二叉树的中序遍历
## 3. 非递归实现二叉树的中序遍历
[94. Binary Tree Inorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-inorder-traversal/description/)
@ -622,7 +622,7 @@ public List<Integer> inorderTraversal(TreeNode root) {
二叉查找树中序遍历有序。
## 修剪二叉查找树
## 1. 修剪二叉查找树
[669. Trim a Binary Search Tree (Easy)](https://leetcode.com/problems/trim-a-binary-search-tree/description/)
@ -662,7 +662,7 @@ public TreeNode trimBST(TreeNode root, int L, int R) {
}
```
## 寻找二叉查找树的第 k 个元素
## 2. 寻找二叉查找树的第 k 个元素
[230. Kth Smallest Element in a BST (Medium)](https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/)
@ -706,7 +706,7 @@ private int count(TreeNode node) {
}
```
## 把二叉查找树每个节点的值都加上比它大的节点的值
## 3. 把二叉查找树每个节点的值都加上比它大的节点的值
[Convert BST to Greater Tree (Easy)](https://leetcode.com/problems/convert-bst-to-greater-tree/description/)
@ -743,7 +743,7 @@ private void traver(TreeNode node) {
}
```
## 二叉查找树的最近公共祖先
## 4. 二叉查找树的最近公共祖先
[235. Lowest Common Ancestor of a Binary Search Tree (Easy)](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/)
@ -767,7 +767,7 @@ public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
}
```
## 二叉树的最近公共祖先
## 5. 二叉树的最近公共祖先
[236. Lowest Common Ancestor of a Binary Tree (Medium) ](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/)
@ -792,7 +792,7 @@ public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
}
```
## 从有序数组中构造二叉查找树
## 6. 从有序数组中构造二叉查找树
[108. Convert Sorted Array to Binary Search Tree (Easy)](https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/description/)
@ -811,7 +811,7 @@ private TreeNode toBST(int[] nums, int sIdx, int eIdx){
}
```
## 根据有序链表构造平衡的二叉查找树
## 7. 根据有序链表构造平衡的二叉查找树
[109. Convert Sorted List to Binary Search Tree (Medium)](https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/description/)
@ -852,7 +852,7 @@ private ListNode preMid(ListNode head) {
}
```
## 在二叉查找树中寻找两个节点,使它们的和为一个给定值
## 8. 在二叉查找树中寻找两个节点,使它们的和为一个给定值
[653. Two Sum IV - Input is a BST (Easy)](https://leetcode.com/problems/two-sum-iv-input-is-a-bst/description/)
@ -896,7 +896,7 @@ private void inOrder(TreeNode root, List<Integer> nums) {
}
```
## 在二叉查找树中查找两个节点之差的最小绝对值
## 9. 在二叉查找树中查找两个节点之差的最小绝对值
[530. Minimum Absolute Difference in BST (Easy)](https://leetcode.com/problems/minimum-absolute-difference-in-bst/description/)
@ -934,7 +934,7 @@ private void inOrder(TreeNode node) {
}
```
## 寻找二叉查找树中出现次数最多的值
## 10. 寻找二叉查找树中出现次数最多的值
[501. Find Mode in Binary Search Tree (Easy)](https://leetcode.com/problems/find-mode-in-binary-search-tree/description/)
@ -991,7 +991,7 @@ private void inOrder(TreeNode node, List<Integer> nums) {
Trie又称前缀树或字典树用于判断字符串是否存在或者是否具有某种字符串前缀。
## 实现一个 Trie
## 1. 实现一个 Trie
[208. Implement Trie (Prefix Tree) (Medium)](https://leetcode.com/problems/implement-trie-prefix-tree/description/)
@ -1053,7 +1053,7 @@ class Trie {
}
```
## 实现一个 Trie用来求前缀和
## 2. 实现一个 Trie用来求前缀和
[677. Map Sum Pairs (Medium)](https://leetcode.com/problems/map-sum-pairs/description/)

View File

@ -1,20 +1,20 @@
<!-- GFM-TOC -->
* [找出两个链表的交点](#找出两个链表的交点)
* [链表反转](#链表反转)
* [归并两个有序的链表](#归并两个有序的链表)
* [从有序链表中删除重复节点](#从有序链表中删除重复节点)
* [删除链表的倒数第 n 个节点](#删除链表的倒数第-n-个节点)
* [交换链表中的相邻结点](#交换链表中的相邻结点)
* [链表求和](#链表求和)
* [回文链表](#回文链表)
* [分隔链表](#分隔链表)
* [链表元素按奇偶聚集](#链表元素按奇偶聚集)
* [1. 找出两个链表的交点](#1-找出两个链表的交点)
* [2. 链表反转](#2-链表反转)
* [3. 归并两个有序的链表](#3-归并两个有序的链表)
* [4. 从有序链表中删除重复节点](#4-从有序链表中删除重复节点)
* [5. 删除链表的倒数第 n 个节点](#5-删除链表的倒数第-n-个节点)
* [6. 交换链表中的相邻结点](#6-交换链表中的相邻结点)
* [7. 链表求和](#7-链表求和)
* [8. 回文链表](#8-回文链表)
* [9. 分隔链表](#9-分隔链表)
* [10. 链表元素按奇偶聚集](#10-链表元素按奇偶聚集)
<!-- GFM-TOC -->
链表是空节点,或者有一个值和一个指向下一个链表的指针,因此很多链表问题可以用递归来处理。
# 找出两个链表的交点
# 1. 找出两个链表的交点
[160. Intersection of Two Linked Lists (Easy)](https://leetcode.com/problems/intersection-of-two-linked-lists/description/)
@ -48,7 +48,7 @@ public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
- 把第一个链表的结尾连接到第二个链表的开头,看第二个链表是否存在环;
- 或者直接比较两个链表的最后一个节点是否相同。
# 链表反转
# 2. 链表反转
[206. Reverse Linked List (Easy)](https://leetcode.com/problems/reverse-linked-list/description/)
@ -82,7 +82,7 @@ public ListNode reverseList(ListNode head) {
}
```
# 归并两个有序的链表
# 3. 归并两个有序的链表
[21. Merge Two Sorted Lists (Easy)](https://leetcode.com/problems/merge-two-sorted-lists/description/)
@ -100,7 +100,7 @@ public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
}
```
# 从有序链表中删除重复节点
# 4. 从有序链表中删除重复节点
[83. Remove Duplicates from Sorted List (Easy)](https://leetcode.com/problems/remove-duplicates-from-sorted-list/description/)
@ -117,7 +117,7 @@ public ListNode deleteDuplicates(ListNode head) {
}
```
# 删除链表的倒数第 n 个节点
# 5. 删除链表的倒数第 n 个节点
[19. Remove Nth Node From End of List (Medium)](https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/)
@ -143,7 +143,7 @@ public ListNode removeNthFromEnd(ListNode head, int n) {
}
```
# 交换链表中的相邻结点
# 6. 交换链表中的相邻结点
[24. Swap Nodes in Pairs (Medium)](https://leetcode.com/problems/swap-nodes-in-pairs/description/)
@ -171,7 +171,7 @@ public ListNode swapPairs(ListNode head) {
}
```
# 链表求和
# 7. 链表求和
[445. Add Two Numbers II (Medium)](https://leetcode.com/problems/add-two-numbers-ii/description/)
@ -210,7 +210,7 @@ private Stack<Integer> buildStack(ListNode l) {
}
```
# 回文链表
# 8. 回文链表
[234. Palindrome Linked List (Easy)](https://leetcode.com/problems/palindrome-linked-list/description/)
@ -259,7 +259,7 @@ private boolean isEqual(ListNode l1, ListNode l2) {
}
```
# 分隔链表
# 9. 分隔链表
[725. Split Linked List in Parts(Medium)](https://leetcode.com/problems/split-linked-list-in-parts/description/)
@ -299,7 +299,7 @@ public ListNode[] splitListToParts(ListNode root, int k) {
}
```
# 链表元素按奇偶聚集
# 10. 链表元素按奇偶聚集
[328. Odd Even Linked List (Medium)](https://leetcode.com/problems/odd-even-linked-list/description/)

View File

@ -1,23 +1,14 @@
<!-- GFM-TOC -->
* [原理](#原理)
* [1. 正常实现](#1-正常实现)
* [2. 时间复杂度](#2-时间复杂度)
* [3. m 计算](#3-m-计算)
* [4. 未成功查找的返回值](#4-未成功查找的返回值)
* [5. 变种](#5-变种)
* [例题](#例题)
* [1. 求开方](#1-求开方)
* [2. 大于给定元素的最小元素](#2-大于给定元素的最小元素)
* [3. 有序数组的 Single Element](#3-有序数组的-single-element)
* [4. 第一个错误的版本](#4-第一个错误的版本)
* [5. 旋转数组的最小数字](#5-旋转数组的最小数字)
* [6. 查找区间](#6-查找区间)
* [1. 求开方](#1-求开方)
* [2. 大于给定元素的最小元素](#2-大于给定元素的最小元素)
* [3. 有序数组的 Single Element](#3-有序数组的-single-element)
* [4. 第一个错误的版本](#4-第一个错误的版本)
* [5. 旋转数组的最小数字](#5-旋转数组的最小数字)
* [6. 查找区间](#6-查找区间)
<!-- GFM-TOC -->
# 原理
## 1. 正常实现
**正常实现**
```text
Input : [1,2,3,4,5]
@ -42,11 +33,11 @@ public int binarySearch(int[] nums, int key) {
}
```
## 2. 时间复杂度
**时间复杂度**
二分查找也称为折半查找,每次都能将查找区间减半,这种折半特性的算法时间复杂度为 O(logN)。
## 3. m 计算
**m 计算**
有两种计算中值 m 的方式:
@ -55,14 +46,14 @@ public int binarySearch(int[] nums, int key) {
l + h 可能出现加法溢出,也就是说加法的结果大于整型能够表示的范围。但是 l 和 h 都为正数,因此 h - l 不会出现加法溢出问题。所以,最好使用第二种计算法方法。
## 4. 未成功查找的返回值
**未成功查找的返回值**
循环退出时如果仍然没有查找到 key那么表示查找失败。可以有两种返回值
- -1以一个错误码表示没有查找到 key
- l将 key 插入到 nums 中的正确位置
## 5. 变种
**变种**
二分查找可以有很多变种,变种实现要注意边界值的判断。例如在一个有重复元素的数组中查找 key 的最左位置的实现如下:
@ -103,9 +94,7 @@ l m h
当循环体退出时,不表示没有查找到 key因此最后返回的结果不应该为 -1。为了验证有没有查找到需要在调用端判断一下返回位置上的值和 key 是否相等。
# 例题
## 1. 求开方
# 1. 求开方
[69. Sqrt(x) (Easy)](https://leetcode.com/problems/sqrtx/description/)
@ -143,7 +132,7 @@ public int mySqrt(int x) {
}
```
## 2. 大于给定元素的最小元素
# 2. 大于给定元素的最小元素
[744. Find Smallest Letter Greater Than Target (Easy)](https://leetcode.com/problems/find-smallest-letter-greater-than-target/description/)
@ -177,7 +166,7 @@ public char nextGreatestLetter(char[] letters, char target) {
}
```
## 3. 有序数组的 Single Element
# 3. 有序数组的 Single Element
[540. Single Element in a Sorted Array (Medium)](https://leetcode.com/problems/single-element-in-a-sorted-array/description/)
@ -214,7 +203,7 @@ public int singleNonDuplicate(int[] nums) {
}
```
## 4. 第一个错误的版本
# 4. 第一个错误的版本
[278. First Bad Version (Easy)](https://leetcode.com/problems/first-bad-version/description/)
@ -239,7 +228,7 @@ public int firstBadVersion(int n) {
}
```
## 5. 旋转数组的最小数字
# 5. 旋转数组的最小数字
[153. Find Minimum in Rotated Sorted Array (Medium)](https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/description/)
@ -263,7 +252,7 @@ public int findMin(int[] nums) {
}
```
## 6. 查找区间
# 6. 查找区间
[34. Find First and Last Position of Element in Sorted Array](https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/)

View File

@ -1,28 +1,21 @@
<!-- GFM-TOC -->
* [原理](#原理)
* [1. 基本原理](#1-基本原理)
* [2. mask 计算](#2-mask-计算)
* [3. Java 中的位操作](#3-java-中的位操作)
* [例题](#例题)
* [统计两个数的二进制表示有多少位不同](#统计两个数的二进制表示有多少位不同)
* [数组中唯一一个不重复的元素](#数组中唯一一个不重复的元素)
* [找出数组中缺失的那个数](#找出数组中缺失的那个数)
* [数组中不重复的两个元素](#数组中不重复的两个元素)
* [翻转一个数的比特位](#翻转一个数的比特位)
* [不用额外变量交换两个整数](#不用额外变量交换两个整数)
* [判断一个数是不是 2 的 n 次方](#判断一个数是不是-2-的-n-次方)
* [判断一个数是不是 4 的 n 次方](#判断一个数是不是-4-的-n-次方)
* [判断一个数的位级表示是否不会出现连续的 0 和 1](#判断一个数的位级表示是否不会出现连续的-0-和-1)
* [求一个数的补码](#求一个数的补码)
* [实现整数的加法](#实现整数的加法)
* [字符串数组最大乘积](#字符串数组最大乘积)
* [统计从 0 \~ n 每个数的二进制表示中 1 的个数](#统计从-0-\~-n-每个数的二进制表示中-1-的个数)
* [1. 统计两个数的二进制表示有多少位不同](#1-统计两个数的二进制表示有多少位不同)
* [2. 数组中唯一一个不重复的元素](#2-数组中唯一一个不重复的元素)
* [3. 找出数组中缺失的那个数](#3-找出数组中缺失的那个数)
* [4. 数组中不重复的两个元素](#4-数组中不重复的两个元素)
* [5. 翻转一个数的比特位](#5-翻转一个数的比特位)
* [6. 不用额外变量交换两个整数](#6-不用额外变量交换两个整数)
* [7. 判断一个数是不是 2 的 n 次方](#7-判断一个数是不是-2-的-n-次方)
* [8. 判断一个数是不是 4 的 n 次方](#8--判断一个数是不是-4-的-n-次方)
* [9. 判断一个数的位级表示是否不会出现连续的 0 和 1](#9-判断一个数的位级表示是否不会出现连续的-0-和-1)
* [10. 求一个数的补码](#10-求一个数的补码)
* [11. 实现整数的加法](#11-实现整数的加法)
* [12. 字符串数组最大乘积](#12-字符串数组最大乘积)
* [13. 统计从 0 \~ n 每个数的二进制表示中 1 的个数](#13-统计从-0-\~-n-每个数的二进制表示中-1-的个数)
<!-- GFM-TOC -->
# 原理
## 1. 基本原理
**基本原理**
0s 表示一串 01s 表示一串 1。
@ -48,7 +41,7 @@ x ^ x = 0 x & x = x x | x = x
- \>\>\> n 为无符号右移,左边会补上 0。
- &lt;&lt; n 为算术左移,相当于乘以 2<sup>n</sup>
## 2. mask 计算
** mask 计算**
要获取 111111111将 0 取反即可,\~0。
@ -58,7 +51,7 @@ x ^ x = 0 x & x = x x | x = x
要得到 1 到 i 位为 0 的 mask只需将 1 到 i 位为 1 的 mask 取反,即 \~(1&lt;&lt;(i+1)-1)。
## 3. Java 中的位操作
**Java 中的位操作**
```html
static int Integer.bitCount(); // 统计 1 的数量
@ -66,9 +59,7 @@ static int Integer.highestOneBit(); // 获得最高位
static String toBinaryString(int i); // 转换为二进制表示的字符串
```
# 例题
## 统计两个数的二进制表示有多少位不同
# 1. 统计两个数的二进制表示有多少位不同
[461. Hamming Distance (Easy)](https://leetcode.com/problems/hamming-distance/)
@ -121,7 +112,7 @@ public int hammingDistance(int x, int y) {
}
```
## 数组中唯一一个不重复的元素
# 2. 数组中唯一一个不重复的元素
[136. Single Number (Easy)](https://leetcode.com/problems/single-number/description/)
@ -140,7 +131,7 @@ public int singleNumber(int[] nums) {
}
```
## 找出数组中缺失的那个数
# 3. 找出数组中缺失的那个数
[268. Missing Number (Easy)](https://leetcode.com/problems/missing-number/description/)
@ -161,7 +152,7 @@ public int missingNumber(int[] nums) {
}
```
## 数组中不重复的两个元素
# 4. 数组中不重复的两个元素
[260. Single Number III (Medium)](https://leetcode.com/problems/single-number-iii/description/)
@ -185,7 +176,7 @@ public int[] singleNumber(int[] nums) {
}
```
## 翻转一个数的比特位
# 5. 翻转一个数的比特位
[190. Reverse Bits (Easy)](https://leetcode.com/problems/reverse-bits/description/)
@ -230,7 +221,7 @@ private int reverseByte(byte b) {
}
```
## 不用额外变量交换两个整数
# 6. 不用额外变量交换两个整数
[程序员代码面试指南 P317](#)
@ -240,7 +231,7 @@ b = a ^ b;
a = a ^ b;
```
## 判断一个数是不是 2 的 n 次方
# 7. 判断一个数是不是 2 的 n 次方
[231. Power of Two (Easy)](https://leetcode.com/problems/power-of-two/description/)
@ -260,7 +251,7 @@ public boolean isPowerOfTwo(int n) {
}
```
## 判断一个数是不是 4 的 n 次方
# 8. 判断一个数是不是 4 的 n 次方
[342. Power of Four (Easy)](https://leetcode.com/problems/power-of-four/)
@ -280,7 +271,7 @@ public boolean isPowerOfFour(int num) {
}
```
## 判断一个数的位级表示是否不会出现连续的 0 和 1
# 9. 判断一个数的位级表示是否不会出现连续的 0 和 1
[693. Binary Number with Alternating Bits (Easy)](https://leetcode.com/problems/binary-number-with-alternating-bits/description/)
@ -305,7 +296,7 @@ public boolean hasAlternatingBits(int n) {
}
```
## 求一个数的补码
# 10. 求一个数的补码
[476. Number Complement (Easy)](https://leetcode.com/problems/number-complement/description/)
@ -360,7 +351,7 @@ public int findComplement(int num) {
}
```
## 实现整数的加法
# 11. 实现整数的加法
[371. Sum of Two Integers (Easy)](https://leetcode.com/problems/sum-of-two-integers/description/)
@ -374,7 +365,7 @@ public int getSum(int a, int b) {
}
```
## 字符串数组最大乘积
# 12. 字符串数组最大乘积
[318. Maximum Product of Word Lengths (Medium)](https://leetcode.com/problems/maximum-product-of-word-lengths/description/)
@ -409,7 +400,7 @@ public int maxProduct(String[] words) {
}
```
## 统计从 0 \~ n 每个数的二进制表示中 1 的个数
# 13. 统计从 0 \~ n 每个数的二进制表示中 1 的个数
[338. Counting Bits (Medium)](https://leetcode.com/problems/counting-bits/description/)

View File

@ -1,11 +1,11 @@
<!-- GFM-TOC -->
* [二分图](#二分图)
* [判断是否为二分图](#判断是否为二分图)
* [1. 判断是否为二分图](#1-判断是否为二分图)
* [拓扑排序](#拓扑排序)
* [课程安排的合法性](#课程安排的合法性)
* [课程安排的顺序](#课程安排的顺序)
* [1. 课程安排的合法性](#1-课程安排的合法性)
* [2. 课程安排的顺序](#2-课程安排的顺序)
* [并查集](#并查集)
* [冗余连接](#冗余连接)
* [1. 冗余连接](#1-冗余连接)
<!-- GFM-TOC -->
@ -13,7 +13,7 @@
如果可以用两种颜色对图中的节点进行着色,并且保证相邻的节点颜色不同,那么这个图就是二分图。
## 判断是否为二分图
## 1. 判断是否为二分图
[785. Is Graph Bipartite? (Medium)](https://leetcode.com/problems/is-graph-bipartite/description/)
@ -72,7 +72,7 @@ private boolean isBipartite(int curNode, int curColor, int[] colors, int[][] gra
常用于在具有先序关系的任务规划中。
## 课程安排的合法性
## 1. 课程安排的合法性
[207. Course Schedule (Medium)](https://leetcode.com/problems/course-schedule/description/)
@ -130,7 +130,7 @@ private boolean hasCycle(boolean[] globalMarked, boolean[] localMarked,
}
```
## 课程安排的顺序
## 2. 课程安排的顺序
[210. Course Schedule II (Medium)](https://leetcode.com/problems/course-schedule-ii/description/)
@ -193,7 +193,7 @@ private boolean hasCycle(boolean[] globalMarked, boolean[] localMarked, List<Int
并查集可以动态地连通两个点,并且可以非常快速地判断两个点是否连通。
## 冗余连接
## 1. 冗余连接
[684. Redundant Connection (Medium)](https://leetcode.com/problems/redundant-connection/description/)

View File

@ -1,17 +1,17 @@
<!-- GFM-TOC -->
* [字符串循环移位包含](#字符串循环移位包含)
* [字符串循环移位](#字符串循环移位)
* [字符串中单词的翻转](#字符串中单词的翻转)
* [两个字符串包含的字符是否完全相同](#两个字符串包含的字符是否完全相同)
* [计算一组字符集合可以组成的回文字符串的最大长度](#计算一组字符集合可以组成的回文字符串的最大长度)
* [字符串同构](#字符串同构)
* [回文子字符串个数](#回文子字符串个数)
* [判断一个整数是否是回文数](#判断一个整数是否是回文数)
* [统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数](#统计二进制字符串中连续-1-和连续-0-数量相同的子字符串个数)
* [1. 字符串循环移位包含](#1-字符串循环移位包含)
* [2. 字符串循环移位](#2-字符串循环移位)
* [3. 字符串中单词的翻转](#3-字符串中单词的翻转)
* [4. 两个字符串包含的字符是否完全相同](#4-两个字符串包含的字符是否完全相同)
* [5. 计算一组字符集合可以组成的回文字符串的最大长度](#5-计算一组字符集合可以组成的回文字符串的最大长度)
* [6. 字符串同构](#6-字符串同构)
* [7. 回文子字符串个数](#7-回文子字符串个数)
* [8. 判断一个整数是否是回文数](#8-判断一个整数是否是回文数)
* [9. 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数](#9-统计二进制字符串中连续-1-和连续-0-数量相同的子字符串个数)
<!-- GFM-TOC -->
# 字符串循环移位包含
# 1. 字符串循环移位包含
[编程之美 3.1](#)
@ -24,7 +24,7 @@ Return : true
s1 进行循环移位的结果是 s1s1 的子字符串,因此只要判断 s2 是否是 s1s1 的子字符串即可。
# 字符串循环移位
# 2. 字符串循环移位
[编程之美 2.17](#)
@ -37,7 +37,7 @@ Return "123abcd"
将 abcd123 中的 abcd 和 123 单独翻转,得到 dcba321然后对整个字符串进行翻转得到 123abcd。
# 字符串中单词的翻转
# 3. 字符串中单词的翻转
[程序员代码面试指南](#)
@ -48,7 +48,7 @@ Return "student a am I"
将每个单词翻转,然后将整个字符串翻转。
# 两个字符串包含的字符是否完全相同
# 4. 两个字符串包含的字符是否完全相同
[242. Valid Anagram (Easy)](https://leetcode.com/problems/valid-anagram/description/)
@ -79,7 +79,7 @@ public boolean isAnagram(String s, String t) {
}
```
# 计算一组字符集合可以组成的回文字符串的最大长度
# 5. 计算一组字符集合可以组成的回文字符串的最大长度
[409. Longest Palindrome (Easy)](https://leetcode.com/problems/longest-palindrome/description/)
@ -110,7 +110,7 @@ public int longestPalindrome(String s) {
}
```
# 字符串同构
# 6. 字符串同构
[205. Isomorphic Strings (Easy)](https://leetcode.com/problems/isomorphic-strings/description/)
@ -138,7 +138,7 @@ public boolean isIsomorphic(String s, String t) {
}
```
# 回文子字符串个数
# 7. 回文子字符串个数
[647. Palindromic Substrings (Medium)](https://leetcode.com/problems/palindromic-substrings/description/)
@ -170,7 +170,7 @@ private void extendSubstrings(String s, int start, int end) {
}
```
# 判断一个整数是否是回文数
# 8. 判断一个整数是否是回文数
[9. Palindrome Number (Easy)](https://leetcode.com/problems/palindrome-number/description/)
@ -195,7 +195,7 @@ public boolean isPalindrome(int x) {
}
```
# 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数
# 9. 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数
[696. Count Binary Substrings (Easy)](https://leetcode.com/problems/count-binary-substrings/description/)

View File

@ -1,14 +1,14 @@
<!-- GFM-TOC -->
* [用栈实现队列](#用栈实现队列)
* [用队列实现栈](#用队列实现栈)
* [最小值栈](#最小值栈)
* [用栈实现括号匹配](#用栈实现括号匹配)
* [数组中元素与下一个比它大的元素之间的距离](#数组中元素与下一个比它大的元素之间的距离)
* [循环数组中比当前元素大的下一个元素](#循环数组中比当前元素大的下一个元素)
* [1. 用栈实现队列](#1-用栈实现队列)
* [2. 用队列实现栈](#2-用队列实现栈)
* [3. 最小值栈](#3-最小值栈)
* [4. 用栈实现括号匹配](#4-用栈实现括号匹配)
* [5. 数组中元素与下一个比它大的元素之间的距离](#5-数组中元素与下一个比它大的元素之间的距离)
* [6. 循环数组中比当前元素大的下一个元素](#6-循环数组中比当前元素大的下一个元素)
<!-- GFM-TOC -->
# 用栈实现队列
# 1. 用栈实现队列
[232. Implement Queue using Stacks (Easy)](https://leetcode.com/problems/implement-queue-using-stacks/description/)
@ -48,7 +48,7 @@ class MyQueue {
}
```
# 用队列实现栈
# 2. 用队列实现栈
[225. Implement Stack using Queues (Easy)](https://leetcode.com/problems/implement-stack-using-queues/description/)
@ -85,7 +85,7 @@ class MyStack {
}
```
# 最小值栈
# 3. 最小值栈
[155. Min Stack (Easy)](https://leetcode.com/problems/min-stack/description/)
@ -126,7 +126,7 @@ class MinStack {
对于实现最小值队列问题,可以先将队列使用栈来实现,然后就将问题转换为最小值栈,这个问题出现在 编程之美3.7。
# 用栈实现括号匹配
# 4. 用栈实现括号匹配
[20. Valid Parentheses (Easy)](https://leetcode.com/problems/valid-parentheses/description/)
@ -159,7 +159,7 @@ public boolean isValid(String s) {
}
```
# 数组中元素与下一个比它大的元素之间的距离
# 5. 数组中元素与下一个比它大的元素之间的距离
[739. Daily Temperatures (Medium)](https://leetcode.com/problems/daily-temperatures/description/)
@ -186,7 +186,7 @@ public int[] dailyTemperatures(int[] temperatures) {
}
```
# 循环数组中比当前元素大的下一个元素
# 6. 循环数组中比当前元素大的下一个元素
[503. Next Greater Element II (Medium)](https://leetcode.com/problems/next-greater-element-ii/description/)

View File

@ -1,40 +1,40 @@
<!-- GFM-TOC -->
* [递归](#递归)
* [树的高度](#树的高度)
* [平衡树](#平衡树)
* [两节点的最长路径](#两节点的最长路径)
* [翻转树](#翻转树)
* [归并两棵树](#归并两棵树)
* [判断路径和是否等于一个数](#判断路径和是否等于一个数)
* [统计路径和等于一个数的路径数量](#统计路径和等于一个数的路径数量)
* [子树](#子树)
* [树的对称](#树的对称)
* [最小路径](#最小路径)
* [统计左叶子节点的和](#统计左叶子节点的和)
* [相同节点值的最大路径长度](#相同节点值的最大路径长度)
* [间隔遍历](#间隔遍历)
* [找出二叉树中第二小的节点](#找出二叉树中第二小的节点)
* [1. 树的高度](#1-树的高度)
* [2. 平衡树](#2-平衡树)
* [3. 两节点的最长路径](#3-两节点的最长路径)
* [4. 翻转树](#4-翻转树)
* [5. 归并两棵树](#5-归并两棵树)
* [6. 判断路径和是否等于一个数](#6-判断路径和是否等于一个数)
* [7. 统计路径和等于一个数的路径数量](#7-统计路径和等于一个数的路径数量)
* [8. 子树](#8-子树)
* [9. 树的对称](#9-树的对称)
* [10. 最小路径](#10-最小路径)
* [11. 统计左叶子节点的和](#11-统计左叶子节点的和)
* [12. 相同节点值的最大路径长度](#12-相同节点值的最大路径长度)
* [13. 间隔遍历](#13-间隔遍历)
* [14. 找出二叉树中第二小的节点](#14-找出二叉树中第二小的节点)
* [层次遍历](#层次遍历)
* [一棵树每层节点的平均数](#一棵树每层节点的平均数)
* [得到左下角的节点](#得到左下角的节点)
* [1. 一棵树每层节点的平均数](#1-一棵树每层节点的平均数)
* [2. 得到左下角的节点](#2-得到左下角的节点)
* [前中后序遍历](#前中后序遍历)
* [非递归实现二叉树的前序遍历](#非递归实现二叉树的前序遍历)
* [非递归实现二叉树的后序遍历](#非递归实现二叉树的后序遍历)
* [非递归实现二叉树的中序遍历](#非递归实现二叉树的中序遍历)
* [1. 非递归实现二叉树的前序遍历](#1-非递归实现二叉树的前序遍历)
* [2. 非递归实现二叉树的后序遍历](#2-非递归实现二叉树的后序遍历)
* [3. 非递归实现二叉树的中序遍历](#3-非递归实现二叉树的中序遍历)
* [BST](#bst)
* [修剪二叉查找树](#修剪二叉查找树)
* [寻找二叉查找树的第 k 个元素](#寻找二叉查找树的第-k-个元素)
* [把二叉查找树每个节点的值都加上比它大的节点的值](#把二叉查找树每个节点的值都加上比它大的节点的值)
* [二叉查找树的最近公共祖先](#二叉查找树的最近公共祖先)
* [二叉树的最近公共祖先](#二叉树的最近公共祖先)
* [从有序数组中构造二叉查找树](#从有序数组中构造二叉查找树)
* [根据有序链表构造平衡的二叉查找树](#根据有序链表构造平衡的二叉查找树)
* [在二叉查找树中寻找两个节点,使它们的和为一个给定值](#在二叉查找树中寻找两个节点,使它们的和为一个给定值)
* [在二叉查找树中查找两个节点之差的最小绝对值](#在二叉查找树中查找两个节点之差的最小绝对值)
* [寻找二叉查找树中出现次数最多的值](#寻找二叉查找树中出现次数最多的值)
* [1. 修剪二叉查找树](#1-修剪二叉查找树)
* [2. 寻找二叉查找树的第 k 个元素](#2-寻找二叉查找树的第-k-个元素)
* [3. 把二叉查找树每个节点的值都加上比它大的节点的值](#3-把二叉查找树每个节点的值都加上比它大的节点的值)
* [4. 二叉查找树的最近公共祖先](#4-二叉查找树的最近公共祖先)
* [5. 二叉树的最近公共祖先](#5-二叉树的最近公共祖先)
* [6. 从有序数组中构造二叉查找树](#6-从有序数组中构造二叉查找树)
* [7. 根据有序链表构造平衡的二叉查找树](#7-根据有序链表构造平衡的二叉查找树)
* [8. 在二叉查找树中寻找两个节点,使它们的和为一个给定值](#8-在二叉查找树中寻找两个节点,使它们的和为一个给定值)
* [9. 在二叉查找树中查找两个节点之差的最小绝对值](#9-在二叉查找树中查找两个节点之差的最小绝对值)
* [10. 寻找二叉查找树中出现次数最多的值](#10-寻找二叉查找树中出现次数最多的值)
* [Trie](#trie)
* [实现一个 Trie](#实现一个-trie)
* [实现一个 Trie用来求前缀和](#实现一个-trie用来求前缀和)
* [1. 实现一个 Trie](#1-实现一个-trie)
* [2. 实现一个 Trie用来求前缀和](#2-实现一个-trie用来求前缀和)
<!-- GFM-TOC -->
@ -42,7 +42,7 @@
一棵树要么是空树,要么有两个指针,每个指针指向一棵树。树是一种递归结构,很多树的问题可以使用递归来处理。
## 树的高度
## 1. 树的高度
[104. Maximum Depth of Binary Tree (Easy)](https://leetcode.com/problems/maximum-depth-of-binary-tree/description/)
@ -53,7 +53,7 @@ public int maxDepth(TreeNode root) {
}
```
## 平衡树
## 2. 平衡树
[110. Balanced Binary Tree (Easy)](https://leetcode.com/problems/balanced-binary-tree/description/)
@ -84,7 +84,7 @@ public int maxDepth(TreeNode root) {
}
```
## 两节点的最长路径
## 3. 两节点的最长路径
[543. Diameter of Binary Tree (Easy)](https://leetcode.com/problems/diameter-of-binary-tree/description/)
@ -117,7 +117,7 @@ private int depth(TreeNode root) {
}
```
## 翻转树
## 4. 翻转树
[226. Invert Binary Tree (Easy)](https://leetcode.com/problems/invert-binary-tree/description/)
@ -131,7 +131,7 @@ public TreeNode invertTree(TreeNode root) {
}
```
## 归并两棵树
## 5. 归并两棵树
[617. Merge Two Binary Trees (Easy)](https://leetcode.com/problems/merge-two-binary-trees/description/)
@ -164,7 +164,7 @@ public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
}
```
## 判断路径和是否等于一个数
## 6. 判断路径和是否等于一个数
[Leetcdoe : 112. Path Sum (Easy)](https://leetcode.com/problems/path-sum/description/)
@ -192,7 +192,7 @@ public boolean hasPathSum(TreeNode root, int sum) {
}
```
## 统计路径和等于一个数的路径数量
## 7. 统计路径和等于一个数的路径数量
[437. Path Sum III (Easy)](https://leetcode.com/problems/path-sum-iii/description/)
@ -232,7 +232,7 @@ private int pathSumStartWithRoot(TreeNode root, int sum) {
}
```
## 子树
## 8. 子树
[572. Subtree of Another Tree (Easy)](https://leetcode.com/problems/subtree-of-another-tree/description/)
@ -283,7 +283,7 @@ private boolean isSubtreeWithRoot(TreeNode s, TreeNode t) {
}
```
## 树的对称
## 9. 树的对称
[101. Symmetric Tree (Easy)](https://leetcode.com/problems/symmetric-tree/description/)
@ -309,7 +309,7 @@ private boolean isSymmetric(TreeNode t1, TreeNode t2) {
}
```
## 最小路径
## 10. 最小路径
[111. Minimum Depth of Binary Tree (Easy)](https://leetcode.com/problems/minimum-depth-of-binary-tree/description/)
@ -325,7 +325,7 @@ public int minDepth(TreeNode root) {
}
```
## 统计左叶子节点的和
## 11. 统计左叶子节点的和
[404. Sum of Left Leaves (Easy)](https://leetcode.com/problems/sum-of-left-leaves/description/)
@ -352,7 +352,7 @@ private boolean isLeaf(TreeNode node){
}
```
## 相同节点值的最大路径长度
## 12. 相同节点值的最大路径长度
[687. Longest Univalue Path (Easy)](https://leetcode.com/problems/longest-univalue-path/)
@ -385,7 +385,7 @@ private int dfs(TreeNode root){
}
```
## 间隔遍历
## 13. 间隔遍历
[337. House Robber III (Medium)](https://leetcode.com/problems/house-robber-iii/description/)
@ -409,7 +409,7 @@ public int rob(TreeNode root) {
}
```
## 找出二叉树中第二小的节点
## 14. 找出二叉树中第二小的节点
[671. Second Minimum Node In a Binary Tree (Easy)](https://leetcode.com/problems/second-minimum-node-in-a-binary-tree/description/)
@ -444,7 +444,7 @@ public int findSecondMinimumValue(TreeNode root) {
使用 BFS 进行层次遍历。不需要使用两个队列来分别存储当前层的节点和下一层的节点,因为在开始遍历一层的节点时,当前队列中的节点数就是当前层的节点数,只要控制遍历这么多节点数,就能保证这次遍历的都是当前层的节点。
## 一棵树每层节点的平均数
## 1. 一棵树每层节点的平均数
[637. Average of Levels in Binary Tree (Easy)](https://leetcode.com/problems/average-of-levels-in-binary-tree/description/)
@ -469,7 +469,7 @@ public List<Double> averageOfLevels(TreeNode root) {
}
```
## 得到左下角的节点
## 2. 得到左下角的节点
[513. Find Bottom Left Tree Value (Easy)](https://leetcode.com/problems/find-bottom-left-tree-value/description/)
@ -550,7 +550,7 @@ void dfs(TreeNode root) {
}
```
## 非递归实现二叉树的前序遍历
## 1. 非递归实现二叉树的前序遍历
[144. Binary Tree Preorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-preorder-traversal/description/)
@ -570,7 +570,7 @@ public List<Integer> preorderTraversal(TreeNode root) {
}
```
## 非递归实现二叉树的后序遍历
## 2. 非递归实现二叉树的后序遍历
[145. Binary Tree Postorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-postorder-traversal/description/)
@ -593,7 +593,7 @@ public List<Integer> postorderTraversal(TreeNode root) {
}
```
## 非递归实现二叉树的中序遍历
## 3. 非递归实现二叉树的中序遍历
[94. Binary Tree Inorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-inorder-traversal/description/)
@ -622,7 +622,7 @@ public List<Integer> inorderTraversal(TreeNode root) {
二叉查找树中序遍历有序。
## 修剪二叉查找树
## 1. 修剪二叉查找树
[669. Trim a Binary Search Tree (Easy)](https://leetcode.com/problems/trim-a-binary-search-tree/description/)
@ -662,7 +662,7 @@ public TreeNode trimBST(TreeNode root, int L, int R) {
}
```
## 寻找二叉查找树的第 k 个元素
## 2. 寻找二叉查找树的第 k 个元素
[230. Kth Smallest Element in a BST (Medium)](https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/)
@ -706,7 +706,7 @@ private int count(TreeNode node) {
}
```
## 把二叉查找树每个节点的值都加上比它大的节点的值
## 3. 把二叉查找树每个节点的值都加上比它大的节点的值
[Convert BST to Greater Tree (Easy)](https://leetcode.com/problems/convert-bst-to-greater-tree/description/)
@ -743,7 +743,7 @@ private void traver(TreeNode node) {
}
```
## 二叉查找树的最近公共祖先
## 4. 二叉查找树的最近公共祖先
[235. Lowest Common Ancestor of a Binary Search Tree (Easy)](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/)
@ -767,7 +767,7 @@ public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
}
```
## 二叉树的最近公共祖先
## 5. 二叉树的最近公共祖先
[236. Lowest Common Ancestor of a Binary Tree (Medium) ](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/)
@ -792,7 +792,7 @@ public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
}
```
## 从有序数组中构造二叉查找树
## 6. 从有序数组中构造二叉查找树
[108. Convert Sorted Array to Binary Search Tree (Easy)](https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/description/)
@ -811,7 +811,7 @@ private TreeNode toBST(int[] nums, int sIdx, int eIdx){
}
```
## 根据有序链表构造平衡的二叉查找树
## 7. 根据有序链表构造平衡的二叉查找树
[109. Convert Sorted List to Binary Search Tree (Medium)](https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/description/)
@ -852,7 +852,7 @@ private ListNode preMid(ListNode head) {
}
```
## 在二叉查找树中寻找两个节点,使它们的和为一个给定值
## 8. 在二叉查找树中寻找两个节点,使它们的和为一个给定值
[653. Two Sum IV - Input is a BST (Easy)](https://leetcode.com/problems/two-sum-iv-input-is-a-bst/description/)
@ -896,7 +896,7 @@ private void inOrder(TreeNode root, List<Integer> nums) {
}
```
## 在二叉查找树中查找两个节点之差的最小绝对值
## 9. 在二叉查找树中查找两个节点之差的最小绝对值
[530. Minimum Absolute Difference in BST (Easy)](https://leetcode.com/problems/minimum-absolute-difference-in-bst/description/)
@ -934,7 +934,7 @@ private void inOrder(TreeNode node) {
}
```
## 寻找二叉查找树中出现次数最多的值
## 10. 寻找二叉查找树中出现次数最多的值
[501. Find Mode in Binary Search Tree (Easy)](https://leetcode.com/problems/find-mode-in-binary-search-tree/description/)
@ -991,7 +991,7 @@ private void inOrder(TreeNode node, List<Integer> nums) {
Trie又称前缀树或字典树用于判断字符串是否存在或者是否具有某种字符串前缀。
## 实现一个 Trie
## 1. 实现一个 Trie
[208. Implement Trie (Prefix Tree) (Medium)](https://leetcode.com/problems/implement-trie-prefix-tree/description/)
@ -1053,7 +1053,7 @@ class Trie {
}
```
## 实现一个 Trie用来求前缀和
## 2. 实现一个 Trie用来求前缀和
[677. Map Sum Pairs (Medium)](https://leetcode.com/problems/map-sum-pairs/description/)

View File

@ -1,20 +1,20 @@
<!-- GFM-TOC -->
* [找出两个链表的交点](#找出两个链表的交点)
* [链表反转](#链表反转)
* [归并两个有序的链表](#归并两个有序的链表)
* [从有序链表中删除重复节点](#从有序链表中删除重复节点)
* [删除链表的倒数第 n 个节点](#删除链表的倒数第-n-个节点)
* [交换链表中的相邻结点](#交换链表中的相邻结点)
* [链表求和](#链表求和)
* [回文链表](#回文链表)
* [分隔链表](#分隔链表)
* [链表元素按奇偶聚集](#链表元素按奇偶聚集)
* [1. 找出两个链表的交点](#1-找出两个链表的交点)
* [2. 链表反转](#2-链表反转)
* [3. 归并两个有序的链表](#3-归并两个有序的链表)
* [4. 从有序链表中删除重复节点](#4-从有序链表中删除重复节点)
* [5. 删除链表的倒数第 n 个节点](#5-删除链表的倒数第-n-个节点)
* [6. 交换链表中的相邻结点](#6-交换链表中的相邻结点)
* [7. 链表求和](#7-链表求和)
* [8. 回文链表](#8-回文链表)
* [9. 分隔链表](#9-分隔链表)
* [10. 链表元素按奇偶聚集](#10-链表元素按奇偶聚集)
<!-- GFM-TOC -->
链表是空节点,或者有一个值和一个指向下一个链表的指针,因此很多链表问题可以用递归来处理。
# 找出两个链表的交点
# 1. 找出两个链表的交点
[160. Intersection of Two Linked Lists (Easy)](https://leetcode.com/problems/intersection-of-two-linked-lists/description/)
@ -48,7 +48,7 @@ public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
- 把第一个链表的结尾连接到第二个链表的开头,看第二个链表是否存在环;
- 或者直接比较两个链表的最后一个节点是否相同。
# 链表反转
# 2. 链表反转
[206. Reverse Linked List (Easy)](https://leetcode.com/problems/reverse-linked-list/description/)
@ -82,7 +82,7 @@ public ListNode reverseList(ListNode head) {
}
```
# 归并两个有序的链表
# 3. 归并两个有序的链表
[21. Merge Two Sorted Lists (Easy)](https://leetcode.com/problems/merge-two-sorted-lists/description/)
@ -100,7 +100,7 @@ public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
}
```
# 从有序链表中删除重复节点
# 4. 从有序链表中删除重复节点
[83. Remove Duplicates from Sorted List (Easy)](https://leetcode.com/problems/remove-duplicates-from-sorted-list/description/)
@ -117,7 +117,7 @@ public ListNode deleteDuplicates(ListNode head) {
}
```
# 删除链表的倒数第 n 个节点
# 5. 删除链表的倒数第 n 个节点
[19. Remove Nth Node From End of List (Medium)](https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/)
@ -143,7 +143,7 @@ public ListNode removeNthFromEnd(ListNode head, int n) {
}
```
# 交换链表中的相邻结点
# 6. 交换链表中的相邻结点
[24. Swap Nodes in Pairs (Medium)](https://leetcode.com/problems/swap-nodes-in-pairs/description/)
@ -171,7 +171,7 @@ public ListNode swapPairs(ListNode head) {
}
```
# 链表求和
# 7. 链表求和
[445. Add Two Numbers II (Medium)](https://leetcode.com/problems/add-two-numbers-ii/description/)
@ -210,7 +210,7 @@ private Stack<Integer> buildStack(ListNode l) {
}
```
# 回文链表
# 8. 回文链表
[234. Palindrome Linked List (Easy)](https://leetcode.com/problems/palindrome-linked-list/description/)
@ -259,7 +259,7 @@ private boolean isEqual(ListNode l1, ListNode l2) {
}
```
# 分隔链表
# 9. 分隔链表
[725. Split Linked List in Parts(Medium)](https://leetcode.com/problems/split-linked-list-in-parts/description/)
@ -299,7 +299,7 @@ public ListNode[] splitListToParts(ListNode root, int k) {
}
```
# 链表元素按奇偶聚集
# 10. 链表元素按奇偶聚集
[328. Odd Even Linked List (Medium)](https://leetcode.com/problems/odd-even-linked-list/description/)