给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]
提示:
-10^9 <= nums1[i], nums2[i] <= 10^9
nums1.length == m + n
nums2.length == n
Java实现:
//方法一:合并后排序
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
System.arraycopy(nums2, 0, nums1, m, n);
Arrays.sort(nums1);
}
}
//方法二: 双指针 / 从前往后
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// Make a copy of nums1.
int [] nums1_copy = new int[m];
System.arraycopy(nums1, 0, nums1_copy, 0, m);
// Two get pointers for nums1_copy and nums2.
int p1 = 0;
int p2 = 0;
// Set pointer for nums1
int p = 0;
// Compare elements from nums1_copy and nums2
// and add the smallest one into nums1.
while ((p1 < m) && (p2 < n))
nums1[p++] = (nums1_copy[p1] < nums2[p2]) ? nums1_copy[p1++] : nums2[p2++];
// if there are still elements to add
if (p1 < m)
System.arraycopy(nums1_copy, p1, nums1, p1 + p2, m + n - p1 - p2);
if (p2 < n)
System.arraycopy(nums2, p2, nums1, p1 + p2, m + n - p1 - p2);
}
}
//方法三 : 双指针 / 从后往前
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
// two get pointers for nums1 and nums2
int p1 = m - 1;
int p2 = n - 1;
// set pointer for nums1
int p = m + n - 1;
// while there are still elements to compare
while ((p1 >= 0) && (p2 >= 0))
// compare two elements from nums1 and nums2
// and add the largest one in nums1
nums1[p--] = (nums1[p1] < nums2[p2]) ? nums2[p2--] : nums1[p1--];
// add missing elements from nums2
System.arraycopy(nums2, 0, nums1, 0, p2 + 1);
}
}
public class MainClass {
public static int[] stringToIntegerArray(String input) {
input = input.trim();
input = input.substring(1, input.length() - 1);
if (input.length() == 0) {
return new int[0];
}
String[] parts = input.split(",");
int[] output = new int[parts.length];
for(int index = 0; index < parts.length; index++) {
String part = parts[index].trim();
output[index] = Integer.parseInt(part);
}
return output;
}
public static String integerArrayToString(int[] nums, int length) {
if (length == 0) {
return "[]";
}
String result = "";
for(int index = 0; index < length; index++) {
int number = nums[index];
result += Integer.toString(number) + ", ";
}
return "[" + result.substring(0, result.length() - 2) + "]";
}
public static String integerArrayToString(int[] nums) {
return integerArrayToString(nums, nums.length);
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
int[] nums1 = stringToIntegerArray(line);
line = in.readLine();
int m = Integer.parseInt(line);
line = in.readLine();
int[] nums2 = stringToIntegerArray(line);
line = in.readLine();
int n = Integer.parseInt(line);
new Solution().merge(nums1, m, nums2, n);
String out = integerArrayToString(nums1);
System.out.print(out);
}
}
}
c++实现:
//方法一:从后往前
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
// 三指针 指针一p1、nums1有效元素尾部;指针二p2、nums2尾部;指针三p3、最终数组尾部
// 1.当,p1>=0时,nums[p1],nums[p2]对比
// 1.1 nums[p1]大,将nums[p1]放入p3位置。p1--,p3--
// 1.2 nums[p2]大于等于nums[p1],将nums[p2]放入p3位置。p2--,p3--
// 2.当,p1<0时,将nums[p2]放入p3位置。p2--,p3--
// 循环结束条件:p2<0
int p1=m-1,p2=n-1,p3=m+n-1;
while(p2 >= 0){
if(p1 >= 0 && nums1[p1] > nums2[p2]){
nums1[p3--] = nums1[p1--];
} else {
nums1[p3--] = nums2[p2--];
}
}
}
};
//方法二:从前往后
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
vector<int> temp(nums1); //初始化m为nums1的拷贝
int i = 0, j = 0, k = 0;
while(i <= m-1 && j <= n-1)
{
if(temp[i] < nums2[j]) nums1[k++] = temp[i++];
else nums1[k++] = nums2[j++];
}
while(i <= m-1)
{
nums1[n+i] = temp[i];
i++;
}
while(j <= n-1)
{
nums1[m+j] = nums2[j];
j++;
}
}
};
void trimLeftTrailingSpaces(string &input) {
input.erase(input.begin(), find_if(input.begin(), input.end(), [](int ch) {
return !isspace(ch);
}));
}
void trimRightTrailingSpaces(string &input) {
input.erase(find_if(input.rbegin(), input.rend(), [](int ch) {
return !isspace(ch);
}).base(), input.end());
}
vector<int> stringToIntegerVector(string input) {
vector<int> output;
trimLeftTrailingSpaces(input);
trimRightTrailingSpaces(input);
input = input.substr(1, input.length() - 2);
stringstream ss;
ss.str(input);
string item;
char delim = ',';
while (getline(ss, item, delim)) {
output.push_back(stoi(item));
}
return output;
}
int stringToInteger(string input) {
return stoi(input);
}
string integerVectorToString(vector<int> list, int length = -1) {
if (length == -1) {
length = list.size();
}
if (length == 0) {
return "[]";
}
string result;
for(int index = 0; index < length; index++) {
int number = list[index];
result += to_string(number) + ", ";
}
return "[" + result.substr(0, result.length() - 2) + "]";
}
int main() {
string line;
while (getline(cin, line)) {
vector<int> nums1 = stringToIntegerVector(line);
getline(cin, line);
int m = stringToInteger(line);
getline(cin, line);
vector<int> nums2 = stringToIntegerVector(line);
getline(cin, line);
int n = stringToInteger(line);
Solution().merge(nums1, m, nums2, n);
string out = integerVectorToString(nums1);
cout << out << endl;
}
return 0;
}