7-2 兩個有序連結串列序列的合併 (20分)

Fmm-PMO發表於2020-11-17

已知兩個非降序連結串列序列S1與S2,設計函式構造出S1與S2合併後的新的非降序連結串列S3。

輸入格式:
輸入分兩行,分別在每行給出由若干個正整數構成的非降序序列,用−1表示序列的結尾(−1不屬於這個序列)。數字用空格間隔。

輸出格式:
在一行中輸出合併後新的非降序連結串列,數字間用空格分開,結尾不能有多餘空格;若新連結串列為空,輸出NULL。

輸入樣例:

1 3 5 -1
2 4 6 8 10 -1

輸出樣例:

1 2 3 4 5 6 8 10

一看是合併集合序列,上來就set_union()一把,12分。。提示有並列和大規模輸入這兩個測試點錯誤。很明顯,如果兩序列有相同的資料,相同的資料也在最後的目標序列中,反正我不喜歡用連結串列,看了看筆記,有merge函式,就用了這個。它可以合併兩個集合序列,而且元素總個數保持不變,就和題目意思一樣了。但要注意為目標序列設定大小,總個數不變,那就直接兩個序列大小之和即可。

merge函式講解

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
	vector<int> v1,v2;
	int num;
	while(true){
		cin >> num;
		if(num==-1)
			break;
		v1.push_back(num);
	}
	while(true){
		cin >> num;
		if(num==-1)
			break;
		v2.push_back(num);
	}
	vector<int> v3(v1.size()+v2.size());
	merge(v1.begin(),v1.end(),v2.begin(),v2.end(),v3.begin());
	if(v3.empty()){
		cout << "NULL";
		return 0;
	}
	for(auto it = v3.begin();it!=v3.end();it++){
		if(it==v3.begin())
			cout << *it;
		else
			cout << " " << *it;
	}
	return 0;
}

相關文章