一、合并两个有序数组
题目比较简单,使用归并排序里面的同样的操作就可以,代码如下所示
#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;
}