两个链表头节点分别是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
