2202: 合并链表(线性表)
时间限制: 1 Sec 内存限制: 128 MB提交: 169 解决: 95
[ 提交][ 状态][ 讨论版][命题人:外部导入]
题目描述
(线性表)假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。
输入
输入长度n:5
输入数据:1 2 5 6 8
输入长度m:5
输入数据:3 4 7 9 10
输出
10 9 8 7 6 5 4 3 2 1
样例输入
4 7 9 10 11 4 8 12 13 14
样例输出
14 13 12 11 10 9 8 7
#include<cstdio>
#include<iostream>
#include<cstdlib>
#define MAXN 110
using namespace std;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode * next;
}LinkNode;
ElemType a[MAXN], b[MAXN];
LinkNode *L1, *L2, *L3;
void CreateList(LinkNode *&L, ElemType a[], int n)
{
LinkNode *r, *s;
L = (LinkNode *)malloc(sizeof(LinkNode));
r = L;
for(int i = 0; i < n; ++i)
{
s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = a[i];
r->next = s;
r = s;
}
r->next = NULL;
}
void MergeList(LinkNode *L1, LinkNode *L2, LinkNode *&L3)
{
LinkNode *pa = L1->next, *pb = L2->next, *r, *s;
L3 = (LinkNode *)malloc(sizeof(LinkNode));
r = L3;
while(pa != NULL && pb != NULL)
{
if(pa->data < pb->data)
{
s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = pa->data;
r->next = s;
r = s;
pa = pa->next;
}
else
{
s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = pb->data;
r->next = s;
r = s;
pb = pb->next;
}
}
while(pa != NULL)
{
s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = pa->data;
r->next = s;
r = s;
pa = pa->next;
}
while(pb != NULL)
{
s = (LinkNode *)malloc(sizeof(LinkNode));
s->data = pb->data;
r->next = s;
r = s;
pb = pb->next;
}
r->next = NULL;
}
void TraverList(LinkNode *&L3)
{
LinkNode *p , *q;
p = L3->next;
L3->next = NULL;
while(p != NULL)
{
q = p->next;
p->next = L3->next;
L3->next = p;
p = q;
}
return ;
}
void DispList(LinkNode *L)
{
LinkNode *p = L->next;
while(p != NULL)
{
cout << p->data << " ";
p = p->next;
}
return ;
}
int main()
{
int n, m, i, j;
LinkNode *r, *s;
cin >> n;
for(i = 0; i < n; ++i)
cin >> a[i];
CreateList(L1, a, n);
cin >> m;
for(i = 0; i < m; ++i)
cin >> b[i];
CreateList(L2, b, m);
MergeList(L1, L2, L3);
TraverList(L3);
DispList(L3);
return 0;
}