归并排序:
LA、LB是两个带头结点的有序链表,归并两个链表得到新的有序表LC。设立指针pa,pb,pc,其中pa和pb分别指向LA,LB中当前待比较的结点,pc指向LC表中当前最后一个结点。将pa,pb结点中值较小的一个链接到pc之后。
typedef struct Node
{
int data;
struct Node* next;
}Node,*PLink;
//销毁链表
void DeleteLink(PLink& head)
{
while(head)
{
PLink delNode = head;
head = head->next;
delete delNode;
delNode = NULL;
}
}
//打印链表
void PrintLink(PLink head,bool bdel=false)
{
if (head == NULL)
{
return;
}
while(head)
{
cout<<head->data<<" ";
head= head->next;
}
cout<<endl;
}
//合并链表 带头结点
PLink union_link_h(PLink& La,PLink& Lb)
{
//La Lb的元素值按照递增排列
PLink pa,pb,pc,LC;
pa = La->next,pb = Lb->next;
LC = pc = La; //用La的头结点作为返回链表的头结点
while(pa&&pb)//若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; //释放Lb的头结点
Lb = NULL;
return R;
}
int main()
{
PLink la,lb,LA,LB,LR;
LA =la = new Node;
LB = lb = new Node;
for (int i=1;i<10;i++)
{
PLink ta,tb;
if (i%2)
{
ta = new Node;
ta->data = i;
la->next = ta;
la=ta;
}
else
{
tb = new Node;
tb->data = i;
lb->next = tb;
lb = tb;
}
}
la->next = NULL;
lb->next = NULL;
PrintLink(LA->next);//LA: 1 3 5 7 9
PrintLink(LB->next);//LB: 2 4 6 8
LR = union_link_h(LA,LB);
PrintLink(LR->next);
DeleteLink(LR);
return 0;
}
运行结果: