线性链表的合并

线性链表的合并一 将所有在 Lb 中 不在 La 中的数据元素插入到 La 中 intLocateEle List head inte 查找在链表中有没有数据域是 e 的节点 有的话返回 1 否则 0List p head gt next while p if p gt data e return1 return0

两个链表头节点分别是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; } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229841.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午3:45
下一篇 2026年3月16日 下午3:46


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号