2つの順序付けられたリンクリストシーケンスの組み合わせ(20ポイント)

2つの非降順リンクリストシーケンスS1とS2が与えられると、設計関数は、S1とS2がマージされた後、新しい非降順リンクリストS3を構築します。

入力形式:
入力は2行に分割されます。各行は、いくつかの正の整数で構成される降順ではないシーケンスを示します。シーケンスの終わりを示すには、-1を使用します(-1はこのシーケンスに属しません)。数字はスペースで区切られます。

出力形式:
マージされた新しい非降順リンクリストを1行で出力します。数値はスペースで区切られ、最後に余分なスペースを入れることはできません。新しいリンクリストが空の場合、NULLが出力されます。

入力サンプル:

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

サンプル出力:

1 2 3 4 5 6 8 10

質問のアイデア:リンクリストを定期的に確立するというアイデア。もちろん、この問題は、より高速なベクトルコンテナを使用して解決することもできます。将来時間があれば、別のブログ記事を書きます。

#include<iostream>
using namespace std;

typedef struct node {
    
    
	int data;
	struct node* next;
}List;

List* creat();
List* sort(List* L1, List* L2);
void print(List* L);
void Delete(List* L);
int main()
{
    
    
	List* L1, * L2, *L3;

	L1 = creat();
	L2 = creat();
	L3 = sort(L1, L2);
	print(L3);

	Delete(L3);
	return 0;
}
List* creat()
{
    
    
	List* head, * p, * rear;
	head = new List;
	head->next = NULL;
	rear = head;


	p = new List;
	p->next = NULL;
	cin >> p->data;
	while (p->data != -1)
	{
    
    
		rear->next = p;
		rear = p;


		p = new List;
		p->next = NULL;
		cin >> p->data;
	}

	return head;
}
void print(List* L)
{
    
    
	List* p;
	p = L->next;
	if (p)
	{
    
    
		cout << p->data;
		p = p->next;
		while (p)
		{
    
    
			cout << " " << p->data;
			p = p->next;
		}
	}
	else
		cout << "NULL";
	
	cout << endl;
}
void Delete(List* L)
{
    
    
	List* p, *q;
	p = L;
	while (p)
	{
    
    
		q = p->next;
		delete p;
		p = q;
	}

	
}
List* sort(List* L1, List* L2)
{
    
    
	List* L3, * pa, * pb, * pc;
	L3 = new List;
	pa = L1->next;
	pb = L2->next;
	pc = L3;
	while (pa && pb)
	{
    
    
		if (pa->data < pb->data)
		{
    
    
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else
		{
    
    
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	}
	pc->next = pa ? pa : pb;
	
	return L3;
}

おすすめ

転載: blog.csdn.net/xdg15294969271/article/details/114024539