链表合并

将两个递增的单链合并一个递增的单链表,要求不另外开辟空间

基本思想:

设两个递增的带头节点的 递增单链表 La 、Lb;(根据自己需要合并到一根链上)

假设合并到 La 这个链上:

定义 指针 r , u, p , q /// r 指向 la 的头节点, p 指向 la 的 第一个数据单元 ,q 指向 lb 的第一个数据单元 。//此时的 r->next=q;

比较 p 和q 所指单元数据的大小。

如果 lb 的数据小,则 用   r 指向 q //r->next=q;

利用 u=q->next;// 记录 la 的下一个节点。

在将 r 指针移动到 q// r指针一自代表 la 中 p 节点的前一个节点。

然后用 q 指向 p ;///q->next=p

最后将 q 移动到 u // u就是刚刚 q 的下一个节点。

如果 q 的值大于等于p 的值,就只需要把 依次往后移动,直到出现 q 的值小于 p 的值。 最后将lb 剩的部分和 la 连接 即可完成!

#include<iostream>
#include<cstdio>
using namespace std;
typedef struct node{
 int data;
 struct node *next;
}linklist;
linklist * Create_linklist_head(){
   linklist *head,*p,*r;
   int st;
   head=(linklist*)malloc(sizeof(linklist));
   r=head;
   while(~scanf("%d",&st))
   {
       if(st==0)///递增序列以输入 0 结束
        break;
       p=(linklist*)malloc(sizeof(linklist));
       p->data=st;
       r->next=p;
       r=p;
   }
   r->next=NULL;
   return head;
}
linklist *Merge_increase_two_list(linklist *la,linklist *lb){
///合并两个递增的序列
      linklist *u,*r,*p,*q;
      p=la->next;
      q=lb->next;
      r=la;
      while(p!=NULL&&q!=NULL){
            if(p->data>q->data)///只要Lb 的值小就合并到la上
            {
                u=q->next;
                r->next=q;
                r=q;
                q->next=p;
                q=u;
            }
            else
            {
               r=p;
               p=p->next;
            }
      }
    if(q!=NULL)///如果Lb 还未遍历完,直接用r 指向 lb
        r->next=q;
    return la;
}
int main()
{
    linklist *la=Create_linklist_head();
    linklist *lb=Create_linklist_head();
    linklist *t=Merge_increase_two_list(la,lb);
    while(t->next!=NULL)///输出合并后的序列
    {
        cout<<t->next->data<<" ";
        t=t->next;
    }
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值