算法步骤:
- 指针pa和pb初始化,分别指向LA和LB的第一个结点
- LC的结点取值为LA的头节点
- 指针pc初始化指向LC的头节点
- pa和pb都没有到达结点表尾时,依此比较pa和pb,选取元素的较小值的点摘取插入到LC中pc之后
- 将此时的非空表的剩余段插入到pc所指结点之后
- 释放LB的头节点
#include <iostream>
using namespace std;
typedef struct LNode//单链表结构
{
int data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList &L)//链表初始化
{
L=new LNode;
L->next=NULL;
}
void CreatList(LinkList &L)//创建单链表
{
L=new LNode;
L->next=NULL;//这里其实就是初始化
int x;
cin>>x;
LNode *r;
r=L;
while(x!=0)
{
LNode *p=new LNode;
p->data=x;
p->next=r->next;
r->next=p;
r=p;
cin>>x;
}
}
void MergeList(LinkList &LA,LinkList &LB,LinkList &LC)//合并两个有序链表
{
LNode *pa,*pb,*pc;
pa=LA->next;
pb=LB->next;
LC=LA;//LC用LA开辟的空间不需要重新开辟空间
pc=LC;
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;
delete LB;
}
void ListPrint(LinkList L)//链表打印
{
LNode *p;
p=L->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
}
int main()
{
//输入例子测试
LinkList LA;
LinkList LB;
LinkList LC;
CreatList(LA);
CreatList(LB);
MergeList(LA,LB,LC);
ListPrint(LC);
}