题目描述
已知数组a中有m个按升序排列的元素,数组b中有n个按降序排列的元素,编程将a与b中的所有元素按降序存入数组c中。
输入
输入有两行,第一行首先是一个正整数m,然后是m个整数;第二行首先是一个正整数n,然后是n个整数,m, n均小于等于1000000。
输出
输出合并后的m+n个整数,数据之间用空格隔开。输出占一行。
样例输入 Copy
4 1 3 5 7
3 6 4 2
样例输出 Copy
7 6 5 4 3 2 1
提示
试图排序的孩子们要小心了~~~~~~
#include <iostream>
#include <stdio.h>
#include <string>
#include <iomanip>
#include <algorithm>
using namespace std;
struct Num {
int num;
Num* next;
};
//该函数用于反转链表1,使链表1的数列反转为从大到小
Num *inverList(Num *head) {
Num *pre, *phead, *temp;
phead = head;
pre = NULL;
while (phead!=nullptr)
{
temp = pre;
pre = phead;
phead = phead->next;
pre->next = temp;
}
return pre;
}
int main()
{
Num* first;
Num* head1;
Num* t1;
first = new Num();
head1 = first;
t1 = first;
Num* second;
Num* head2;
Num* t2;
second = new Num();
head2 = second;
t2 = second;
int m, n;
cin >> m;
for (int i = 0;i < m;i++) {
first = new Num();
cin >> first->num;
t1->next = first;
t1 = t1->next;
}
cin >> n;
for (int i = 0; i < n; i++)
{
second = new Num();
cin >> second->num;
t2->next = second;
t2 = t2->next;
}
head1 = head1->next;
head2 = head2->next;
head1 = inverList(head1);
//思路就是从两个链表开始,判断大小,大的一方输出然后指针向下移动一个
//依次类推,当其中一个链表为空时,只输出剩下的另一个链表
while (head1!=nullptr||head2!=nullptr)
{
if (head1 == nullptr) {
cout << head2->num << " ";
head2 = head2->next;
}
else if(head2==nullptr)
{
cout << head1->num << " ";
head1 = head1->next;
}
else if(head1->num>head2->num)
{
cout << head1->num << " ";
head1 = head1->next;
}
else
{
cout << head2->num << " ";
head2 = head2->next;
}
}
}