一、合并两个有序数组
题目比较简单,使用归并排序里面的同样的操作就可以,代码如下所示
#include <iostream>
#include <vector>
using namespace std;
/* leetcode88题:合并两个有序数组 */
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1 = m - 1, p2 = n - 1, p3 = m + n - 1;
while (p1 != -1 || p2 != -1)
{
//注意“||”两端的条件最终得到拷贝数组中的元素的动作是相同的才可以
if (p1 == -1 || p2 != -1 && (nums1[p1] <= nums2[p2]))
{
nums1[p3--] = nums2[p2--];
}
else
{
nums1[p3--] = nums1[p1--];
}
}
return;
}
};
int main()
{
return 0;
}
二、合并两个有序链表
#include <iostream>
#include <vector>
using namespace std;
/* leetcode88题:合并两个有序数组 */
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1 = m - 1, p2 = n - 1, p3 = m + n - 1;
while (p1 != -1 || p2 != -1)
{
//注意“||”两端的条件最终得到拷贝数组中的元素的动作是相同的才可以
if (p1 == -1 || p2 != -1 && (nums1[p1] <= nums2[p2]))
{
nums1[p3--] = nums2[p2--];
}
else
{
nums1[p3--] = nums1[p1--];
}
}
return;
}
};
/* leetcode:21题,合并两个有序链表,采用的算法和合并数组一样 */
/* 直接创建一个头节点,从前向后(从小到大)的顺序插入排序就可以了 */
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode ret, * p1 = &ret; //如果只创建一个指针,是没有链表元素的指针和元素的内存的,所以不能存储下一个节点地址。
while (list1 || list2)
{
if (list1 == NULL || list2 != NULL && (list2->val <= list1->val))
{
p1->next = list2;
list2 = list2->next;
p1 = p1->next;
}else{
p1->next = list1;
list1 = list1->next;
p1 = p1->next;
}
}
return ret.next;
}
};
int main()
{
return 0;
}