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;
}