Skip to content

Commit 41cd5ac

Browse files
committed
88.合并两个有序数组,双指针
1 parent dd2722d commit 41cd5ac

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

leetcode_Java/DoneTitle.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
77. 组合
2929
78. 子集
3030
84. 柱状图中最大的矩形
31+
88. 合并两个有序数组
3132
90. 子集 II
3233
93. 复原 IP 地址
3334
94. 二叉树的中序遍历

leetcode_Java/Solution0088.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// 88. 合并两个有序数组
2+
3+
4+
/*
5+
直接合并后排序
6+
*/
7+
class Solution {
8+
public void merge(int[] nums1, int m, int[] nums2, int n) {
9+
for (int i = 0; i < n; i++) {
10+
nums1[m + i] = nums2[i];
11+
}
12+
Arrays.sort(nums1);
13+
}
14+
}
15+
16+
17+
/*
18+
双指针:创建新的数组空间,两个数组从左到右遍历比较出 较小的元素,从数组前面开始存储。不能在原数组存储,因为元素可能取出前被覆盖
19+
*/
20+
class Solution {
21+
public void merge(int[] nums1, int m, int[] nums2, int n) {
22+
int[] nums = new int[m + n];
23+
int p1 = 0, p2 = 0, index = 0;
24+
int num;
25+
while (p1 < m || p2 < n) {
26+
if (p1 == m) {
27+
num = nums2[p2++];
28+
} else if (p2 == n) {
29+
num = nums1[p1++];
30+
} else if (nums1[p1] < nums2[p2]) {
31+
num = nums1[p1++];
32+
} else {
33+
num = nums2[p2++];
34+
}
35+
nums[index++] = num;
36+
}
37+
for (int i = 0; i < m + n; i++) {
38+
nums1[i] = nums[i];
39+
}
40+
}
41+
}
42+
43+
44+
/*
45+
逆向双指针:数组后半部分是空的,两个数组从右到左遍历比较出 较大的元素,从数组后面开始存储
46+
*/
47+
class Solution {
48+
public void merge(int[] nums1, int m, int[] nums2, int n) {
49+
int p1 = m - 1, p2 = n - 1, index = m + n - 1;
50+
int num;
51+
while (p1 >= 0 || p2 >= 0) {
52+
if (p1 == -1) {
53+
num = nums2[p2--];
54+
} else if (p2 == -1) {
55+
num = nums1[p1--];
56+
} else if (nums1[p1] > nums2[p2]) {
57+
num = nums1[p1--];
58+
} else {
59+
num = nums2[p2--];
60+
}
61+
nums1[index--] = num;
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)