- 合并两个有序数组
我的思路:
遍历nums2,并在nums1中不断找到插入位置,找到插入位置后数组整体向后移一格,空出插入位置并插入
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
if (n == 0) {
return;
}
for (int i = 0; i < n; i++) {
int j = 0;
while (nums2[i] > nums1[j] && j < m) {
j++;
}
for (int k = m; k > j; k--) {
nums1[k] = nums1[k - 1];
}
nums1[j] = nums2[i];
m++;
}
}
}
官方思路: 开辟一个新的数组,从nums1和nums2中不断找出最小的插入到新的数组中。最后把新的数组赋值给nums1
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1 = 0, p2 = 0;
int[] sorted = new int[m + n];
int cur = 0;
while (p1 < m && p2 < n) {
if (nums1[p1] <= nums2[p2]) {
sorted[cur++] = nums1[p1++];
} else {
sorted[cur++] = nums2[p2++];
}
}
while (p1 < m) {
sorted[cur++] = nums1[p1++];
}
while (p2 < n) {
sorted[cur++] = nums2[p2++];
}
for (int i = 0; i != m + n; ++i) {
nums1[i] = sorted[i];
}
}
}
- 二叉树的中序遍历
思路:用递归对二叉树进行中序遍历,没什么好说的
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
inorder(root, list);
return list;
}
public void inorder(TreeNode root, List<Integer> list) {
if (root == null) {
return;
}
inorder(root.left, list);
list.add(root.val);
inorder(root.right, list);
}
}
- 相同的树
思路:递归
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
} else if ((p == null && q != null) || (p != null && q == null)) {
return false;
} else if (p.val != q.val) {
return false;
} else {
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}
}