个人理解:利用指针来访问两个有序的链表,让两个链表相互比较,如果La的元素小于Lb中的,那么就把Lb中的元素存入Lc,否则就把La中的存入Lc,如果两个相同就把La的存进去,Lb的删掉,更新指针。如果到其中一个的结尾了,另一个没有到结尾,就把剩余的元素插到Lc中。最后删除Lb;释放Lb的空间。如果解释的不清楚,请理解一下。其他就是链表的基本操作。
废话少说直接上代码嘞!希望大佬可以指点错误;
#include<iostream>
using namespace std;
#define OK 1
#define ERROR -2
typedef int ElemType;
typedef struct LNode
{
ElemType date;
struct LNode *next;
}LNode,*List;
int i,j;
List L,s,p,q;
int InList(List &L)//初始化链表
{
L = new LNode;
L->next = NULL;
return OK;
}
void HInput(List &L,int n)//后插法 插入的元素和原来的顺序一样
{
L = new LNode;
L->next =NULL;
s = L;
for(i=0;i<n;++i)
{
p = new LNode;
cin>>p->date ;
p->next = NULL;
s->next = p;
s = p;
}
}
int Delete(List &L,int n)//删除 第n位的值
{
p=L;
j=0;
while((p->next)&&(j<n-1))
{
p = p->next ;
++j;
}
if(!(p->next )||(j>i-1)) return ERROR;
s = p->next ;//s指向要删除的
p->next = s->next ;//要删除节点的下一个链接到前一个
delete s;
return OK;
}
int ListInsret(List &L,int n,ElemType e)//插入数据,n为插入的位置,e为要插入的值
{
p=L;
j=0;
while(p&&(j<n-1))//找插入位置的前驱
{
p=p->next;
++j;
}
if(!p||(j>n-1)) return ERROR;
s= new LNode;
s->date= e;
s->next = p->next;//s的下一位是原本p的下一位,p为要插入的位置的前驱
p->next = s;
return OK;
}
ElemType Get(List L,int n,ElemType &e)//获取第n位的元素赋给e
{
p =L->next ;int j=1;
while(p&&j<n)
{
p = p->next;
++j;
}
if(!p||j>n) return -2;
e = p->date ;
return e;
}
int Find(List L,ElemType e)//查找值为e的数据,如果找到返回1;否则返回0
{
p=L->next;
while(p&&(p->date )!=e)
{
p=p->next ;
}
if(p==NULL) return 0;
return OK;
}
void Output(List L)//输出链表
{
p = L->next ;
while(p)
{
cout<<p->date <<" ";
p = p->next ;
}
cout<<endl;
}
void MergeList(List &La,List &Lb,List &Lc)//比较La和Lb中的元素存入Lc
{
List pa=La->next;List pb=Lb->next;//pa指向La的首元结点,pb指向Lb的首元结点
List pc;
Lc=pc=La;//pc=Lc指向La的头结点
while(pa&&pb)
{
if(pa->date<pb->date ){pc->next =pa;pc=pa;pa=pa->next;}//如果pa指向的值比pb指向的值小的话,pa插入到pc里面,更新pc指针为pa,pa指针指向下一个
else if(pb->date<pa->date ){pc->next=pb;pc=pb;pb=pb->next;}
else {
pc->next=pa;pc=pa;pa=pa->next;//如果pa的值=pb的值,把pa插到pc里头,pb删除,pb指向下一个
q=pb->next;delete pb;pb=q;
}
}
pc->next =pa?pa:pb;//插入剩余段
delete Lb;//释放Lb的头结点
}
int main()
{
List Lb,La,Lc;
InList(La);
InList(Lb);
InList(Lc);
int n,m;
cin>>n;
HInput(La,n);
cin>>m;
HInput(Lb,m);
MergeList(La,Lb,Lc);
Output(La);
return 0;
}