您的位置:首页 > 其它

合并两个有序单链表

2015-11-12 20:13 387 查看
算法思想:
方法一:非递归
建立 一个新表LC,利用尾插法建立单链表的方法,从头结开始比较LA、LB中的数据,将LA、LB中较小的数插入到LC 中。
1、设pa、pb分别指向LA、LB的头结点,比较两个数据,将元素较小的节点插入LC中,然后将元素较小的指针指向下一节点,另
一指针不动。直到有一指针指向空节点。
2、将另一未指向空节点的指针的剩余节点全都链到 LC中。
3、返回单链表LC。
PLinkNode MergeList(PLinkNode& LA,PLinkNode& LB)
{
LinkNode *pa = LA;
LinkNode *pb = LB;
LinkNode *LC = NULL;
LinkNode *pc;

//找出两个链表中第一个结点较小的结点,LC记录较小结点的头结点
if(pa->_data <= pb->_data)
{
LC = pa;
pa = pa->_next;
}
else
{
LC = pb;
pb = pb->_next;
}
pc=LC;

//在两个链表中遍历比较,将值较小的结点链接到pc结点后
while (pa != NULL && pb != NULL)
{
if(pa->_data <= pb->_data )
{
pc->_next = pa;
pc = pa;
pa = pa->_next;
}
else
{
pc->_next = pb;
pc = pb;
pb = pb->_next;
}
}

//将pa或pb剩余的结点链到pc之后,完成整个合并的过程
if(pa)
pc->_next = pa;
else
pc->_next = pb;
return LC;
/*LinkNode *LC=NULL;
LinkNode *pa = LA;
LinkNode *pb = LB;
LinkNode *pc = LC;
while(pa != NULL && pb != NULL)
{
//尾插法
if(pa->_data <= pb->_data)
{
PushBack(LC,pa->_data);
pa = pa->_next;
}
else
{
PushBack(LC,pb->_data);
pb = pb->_next;
}

}
while(pa !=NULL)
{
PushBack(LC,pa->_data);
pa=pa->_next;
}

while(pb != NULL)
{
PushBack(LC,pb->_data);
pb = pb->_next;

}
return LC;*/
}



方法二: 递归
PLinkNode  MergeRecursive(PLinkNode& head1 , PLinkNode& head2)
{
PLinkNode head = NULL ;
if ( head1 == NULL )
return head2 ;
if ( head2 == NULL)
return head1 ;
if ( head1->_data <= head2->_data )
{
head = head1 ;
head->_next = MergeRecursive(head1->_next,head2);
}
else
{
head = head2 ;
head->_next = MergeRecursive(head1,head2->_next);
}
return head ;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: