单链表的合并(递归、非递归)


                                                                                  递归方法将两个链表合并成一个链表

例:已知两个单链表head1和head2各自有序升序排列,请把他们合并成一个连表并依然有序,并保留原来所有节点

假设以下两个链表:
链表1:1->3->5
链表2:2->4->6
(1)比较1和链表2的第一个节点数据,由于1<2,因此把结果链表头结点指向链表1中的第一个节点,即数据1所在的节点
(2)对剩余的链表1(3->5)和链表2在调用本过程,比较得到结果链表的第二个节点,即2与3比较得到2,此时合并后的链表节点为1->2,这样
递归知道两个链表的节点都被加到结果链表中。
node *mergerecursive(node *head1,node *head2)
{
if(head1==NULL)
{
return head2;
}
if(head2==NULL)
{
return head1;
}
node *head=NULL;
if(head->data<head2->data)
{
head=head1;
head->next=mergerecursive(head1->next,head2);
}
else
{
head=head2;
head->next=mergerecursive(head1,head2->next);
}
return head;

}


  非递归方式合并:
例:已知两个单链表head1和head2各自有序升序排列,请把他们合并成一个连表并依然有序,并保留原来所有节点


因为head1和head2是有序的,所以只需要把较短链表的各个元素有序的插入到较长的链表之中就可以了
node *t_node(node *head,node *item)
{
node *p=head;
node *q=NULL;//始终指向p之前的节点
while(p->data<item->data&&p!=NULL)
{
q=p;
p=p->next;
}
if(p=head)插入到原头结点之前
{
item->next=p;
return item;
}
插入到p与q之间
q->next=item;
item->next=p;
return head;
}
合并单链表
node merge(node *head1,node *head2)
{
node *head;//合并后的头指针
node *p;
node *nextp;//指向p之后
if(head1==NULL)//一个链表为空返回另一个链表
{
return head2;
}
else if(head2==NULL)//一个链表为空返回另一个链表
{
return head1;

两个链表都不为空
if(length(head1)>=length(head2))//length()函数测单链表的长度,函数的使用见我的博客
{
head=head1;
p=head2;
}
else
{
head=head2;
p=head1;
}
while(p!=NULL)
{
nextp=p->next;//
head=insert_node(head ,p);
p=nextp;//指向要插入的下一个节点
}
return head;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值