合并两个有序链表

https://leetcode.cn/problems/merge-two-sorted-lists/?favorite=2cktkvj

要注意链表需要构造一个节点指针来遍历,,,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ListNode {
int val;
ListNode next;

ListNode() {
}

ListNode(int val) {
this.val = val;
}

ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class mergeTwoLists {
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode myListHead = new ListNode(0);
ListNode myList = myListHead;
if (list1 == null) {
return list2;
}
if (list2 == null) {
return list1;
}
while (list1 != null && list2 != null) {
if (list1.val < list2.val) {
myList.next = list1;
myList = myList.next;
list1 = list1.next;
} else {
myList.next = list2;
myList = myList.next;
list2 = list2.next;
}
}
myList.next = list1 == null ? list2 : list1;
return myListHead.next;
}
}
}

爬楼梯

https://leetcode.cn/problems/climbing-stairs/?favorite=2cktkvj

由于总方案数=最后走一步的方案数+最后走两步的方案数。

所以这题就是个求斐波那契数列第n项的值,使用滚动数组。0 0 1 1 2 3 5 8

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public int climbStairs(int n) {
int p = 0, q = 0, r = 1;
for (int i = 1; i <= n; i++) {
p = q;
q = r;
r = p + q;
}
return r;
}
}

二叉树的中序遍历

基础递归,就这还写了半天,重开吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class TreeNode {
int val;
TreeNode left;
TreeNode right;

TreeNode() {
}

TreeNode(int val) {
this.val = val;
}

TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
TreeNode treeNode = root;
List<Integer> list = new ArrayList<>();
if (root == null) {
return list;
}
traversal(list,treeNode);
return list;
}

public void traversal(List<Integer> list, TreeNode treeNode) {
if (treeNode.left != null) {
traversal(list, treeNode.left);
}
list.add(treeNode.val);
if (treeNode.right != null) {
traversal(list, treeNode.right);
}
}
}

还可以用栈迭代,,,不会

对称二叉树

不会,,多写多练多看吧,,

需要复习一下有关null的各种知识了,如何比较,空指针异常之类的,,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public boolean isSymmetric(TreeNode root) {
return treeSymmetric(root, root);
}

public boolean treeSymmetric(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
}
if (p == null || q == null) {
return false;
}
return p.val == q.val && treeSymmetric(p.left, q.right) && treeSymmetric(p.right, q.left);
}
}

二叉树的直径

https://leetcode.cn/problems/diameter-of-binary-tree/

递归+DFS

这里的depth求的是每个节点子树的最大深度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
int max = 0;

public int diameterOfBinaryTree(TreeNode root) {
depth(root);
return max;
}

public int depth(TreeNode root) {
if (root == null) {
return 0;
}
int left = depth(root.left);
int right = depth(root.right);
max = Math.max(max, left + right);
return Math.max(left, right) + 1;
}
}

合并二叉树

https://leetcode.cn/problems/merge-two-binary-trees/

也是递归+DFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if (root1 == null) {
return root2;
}
if (root2 == null) {
return root1;
}
TreeNode treeNode = new TreeNode(root1.val + root2.val);
treeNode.left = mergeTrees(root1.left, root2.left);
treeNode.right = mergeTrees(root1.right, root2.right);
return treeNode;
}
}

二叉树的最大深度

https://leetcode.cn/problems/maximum-depth-of-binary-tree/

很简单,我都会

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
int left = maxDepth(root.left);
int right = maxDepth(root.right);
int max = Math.max(left, right);
return max + 1;
}
}

买卖股票的最佳时机

https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/

暴力解法,直接被巨量数据狂暴轰入,宕机了,不行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int maxProfit(int[] prices) {
int maxProfit = 0;
for (int i = 0; i < prices.length; i++) {
int buy = prices[i];
for (int j = prices.length - 1; j > i; j--) {
int profit = prices[j] - buy;
if (profit > maxProfit) {
maxProfit = profit;
}
}
}
return maxProfit;
}
}

其实只需要找到最小价格,再用之后每一天的价格减去最小价格,找到最大利润即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution1 {
public int maxProfit1(int[] prices) {
int maxProfit = 0;
int min = Integer.MAX_VALUE;
for (int i = 0; i < prices.length; i++) {
if (prices[i] < min) {
min = prices[i];
}
if (prices[i] - min > maxProfit) {
maxProfit = prices[i] - min;
}
}
return maxProfit;
}
}

只出现一次的数字

https://leetcode.cn/problems/single-number/?favorite=2cktkvj

很简单,我都会

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int singleNumber(int[] nums) {
HashSet<Integer> hashSet = new HashSet<>();
hashSet.add(nums[0]);
for (int i = 1; i < nums.length; i++) {
if (hashSet.contains(nums[i])) {
hashSet.remove(nums[i]);
} else {
hashSet.add(nums[i]);
}
}
Iterator<Integer> iterator = hashSet.iterator();
return iterator.next();
}
}

如何才能做到线性时间复杂度和常数空间复杂度呢?

详见答案,,我跪了。