线性链表的合并

两个链表头节点分别是La,Lb

一、将所有在Lb中,不在La中的数据元素插入到La中

int LocateElem(List *head,int e){//查找在链表中有没有数据域是e的节点,有的话返回1,否则0
    List *p=head->next;
    while(p){
        if(p->data==e)
            return 1;
    }
    return 0;
}
void InsertElem(List *head,int e){     //头插法
    List *p=(List *)malloc(sizeof(List));
    p->data=e;
    p->next=head->next;
    head->next=p;
}
void unionList(List *La,List *Lb){//线性链表合并
    int e;
    List *p=Lb->next;
    while(p){
        e=p->data;
        if(!LocateElem(La,e))
            InsertElem(La,e);
        p=p->next;
    }
}

二、将两个非递减线性链表La、Lb合并为一个新的非递减线性表

元素可以重复

  • 算法思想:(1)创建一个空链表Lc,(2)依次从La和Lb中摘取较小的节点插入到Lc表的最后,直到其中 一个变为空表位置,(3)继续将La或者Lb中还剩下元素的那些节点插到Lc的最后
List* LinkList(List *La,List *Lb){
    List *pa,*pb,*pc;//pc指向新链表Lc的尾节点,因为都是非递减链表,所以使用尾插法
    List *Lc;
    Lc=pc=La; //利用La的头节点作为Lc的头节点
    pa=La->next;
    pb=Lb->next;
    while(pa&&pb){
        if(pa->data<=pb->data){
            pc->next=pa;
            pc=pc->next;//更新pc指向Lc的尾节点
            pa=pa->next;
        }
        else{
            pc->next=pb;
            pc=pc->next;
            pb=pb->next;
        }
    }
    pc->next=pa?pa:pb;//将剩下的元素插入到LC的尾部
    free(Lb);
    return Lc;
}

三、如果将二的要求改为将两个非递减线性表合并成一个非递增线性表

算法思想:只需要将二中的代码改为对Lc进行头插法,即每次都在头节点后第一个位置上插入La和Lb中较小的元素即可,最后只需要将剩下的元素依次插入Lc的头部。

四、将两个无重复的递增链表合并成一个无重复的递增链表

和上面的二代码类似,不过加上了相等的判断条件

List* LinkList(List *La,List *Lb){
    List *pa,*pb,*pc;
    List *Lc;
    Lc=pc=La; 
    pa=La->next;
    pb=Lb->next;
    while(pa&&pb){
        if(pa->data<pb->data){
            pc->next=pa;
            pc=pc->next;
            pa=pa->next;
        }
        else if(pa->data>pb->data){
            pc->next=pb;
            pc=pc->next;
            pb=pb->next;
        }
        else{//相等的时候
            pa=pa->next;
            pb=pb->next;
            pc=pc->next;
        }
    }
    pc->next=pa?pa:pb;
    free(Lb);
    return Lc;
}
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值