两个有序链表序列的合并 (20 分)
原创
©著作权归作者所有:来自51CTO博客作者mb5dbc2345bf8de的原创作品,请联系作者获取转载授权,否则将追究法律责任
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
输出样例:
题目思路:常规建立链表思路。当然,这道题还能使用vector容器解决,更加快捷。后续有时间再写一篇博客发出来。
#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;
}