实现一个函数,将两个非空且递增有序的单链表合并成一个递增有序的单链表并输出。
输入样例:
3
1 3 5
4
2 4 6 8
输出样例:
1 2 3 4 5 6 8
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
Status InitList(LinkList &L)
{
L = new LNode;
L->next = NULL;
return OK;
}
void CreateList(LinkList L, int n)
{
LNode *p, *r;
int i;
r = L;
for(i = 0; i < n; ++i)
{
p = new LNode;
cin >> p->data;
r->next = p;
r = p;
}
r->next = NULL;
}
/* 请在这里填写答案 */
void MergeList(LinkList LA, LinkList LB, LinkList &LC)
{
LNode *pa, *pb, *pc; //生成新结点指针pa, pb, pc
pa = LA->next; //指针pa指向La表的首元结点
pb = LB->next; //指针pb指向Lb表的首元结点
LC = LA; //用La的头结点作为Lc的头结点
// Lc->next = NULL;
pc = LC; //pc的初值指向Lc的头结点
while(pa && pb)
{ //如果La, Lb链表均为到达表尾,依此“摘取”两表中较小的结点插入到Lc的最后
if (pa->data <= pb->data) //摘取pa所指结点
{
pc->next = pa; //将pa所指结点链接到pc所指结点之后
pc = pa; //pc指向pa
pa = pa->next; //pa指向下一结点
}
else
{ //pb同理
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
//将非空表剩余的元素插入到pc所指结点之后
//(也就是,如果pa为空,就将pb所指结点的元素插到pc结点最后,反之,把pa所指结点元素插到pc最后)
pc->next = pa ? pa : pb;
delete LB; //释放Lb的头结点
}
Status DispList(LinkList L)
{
LNode *p = L->next;
if(!p)
return ERROR;
while(p->next)
{
cout << p->data << ' ';
p = p->next;
}
cout << p->data;
return OK;
}
int main()
{
LinkList La = NULL, Lb = NULL, Lc = NULL;
int numa, numb;
InitList(La);
InitList(Lb);
cin >> numa;
CreateList(La, numa);
cin >> numb;
CreateList(Lb, numb);
MergeList(La, Lb, Lc);
DispList(Lc);
return 0;
}
07-28
3358
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交