链表的相关算法及应用(四)

问题十一 :将两个递增的链表合并为一个递增的链表 

问题十二 :将两个递增的链表合并为一个递减的链表,并用原来的两个单链表的节点存放归并后的单链表

问题十三 :将两个递增的链表A B的交集存放与A中

问题十四 :序列A B 存入了两个单链表,判断B是否是A的连续子序列 // 此处暴力枚举法 改进请参考KMP算法

问题十五 :删除倒数第n个节点

//问题十一 将两个递增的链表合并为一个递增的链表 
void mergeList(LinkList &A,LinkList &B){
    LNode *a=A->next,*b=B->next,*p=A;
    while(a!=NULL&&b!=NULL){
        if(a->data<=b->data){
            p->next=a;
            p=a;
            a=a->next;
        }else{
            p->next=b;
            p=b;
            b=b->next;
        }
    }
    if(a)
        p->next=a;
    if(b)
        p->next=b;
        
}
//问题十二 将两个递增的链表合并为一个递减的链表 
//            并用原来的两个单链表的节点存放归并后的单链表 
LinkList mergeList2(LinkList &A,LinkList &B){
    LinkList C = (LinkList)malloc(sizeof(LNode));
    C->next=NULL;
    LNode *a=A->next,*b=B->next,*p=A,*r;
    while(a!=NULL&&b!=NULL){
        if(a->data<=b->data){
            r=a->next;
            a->next=C->next;
            C->next=a;
            a=r;
        }else{
            r=b->next;
            b->next = C->next;
            C->next=b;
            b=r;
        }
    }
    a = a==NULL?b:a;
    while(a){
        r=a->next;
        a->next=C->next;
        C->next=a;
        a=r;
    }
    return C;    
}
// 问题十三 将两个递增的链表A B的交集存放与A中
LinkList Union(LinkList &A,LinkList &B){
    LNode *a=A->next,*b=B->next,*p=A,*t;
    while(a!=NULL&&b!=NULL){
        if(a->data==b->data){
            p->next=a;
            p=a;
            a=a->next;
            t=b;
            b=b->next;
            free(t);
        }else if(a->data<b->data){
            t=a;
            a=a->next;
            free(t);
        }else{
            t=b;
            b=b->next;
            free(t);
        }
    }
    free(B);    
    return A;
} 
// 问题十四 序列A B 存入了两个单链表,判断B是否是A的连续子序列
// 暴力枚举法 改进请参考KMP算法 
 LNode *isSubSeq(LinkList A,LinkList B){
     LNode *a=A->next,*b=B->next;
     LNode *r=a; 
    while(r){
        a=r;
         b=B->next;
         while(a!=NULL&&b!=NULL&&a->data==b->data){
            a=a->next;             
            b=b->next;
        }
        if(b==NULL){
            return r;    //匹配成功 返回在A中成功匹配的第一个节点 
        }
        r=r->next;
     }
    return NULL;        //匹配失败 返回NULL     
 } 
//删除倒数第n个节点
void delLastN(LinkList &L,int n){
    LNode *r=L->next,*l=L->next;
    
    for(int i=1;i<n;i++){
        r=r->next;
    }
    
    while(r->next->next!=NULL){
        l=l->next;
        r=r->next;
    }
    l->next=l->next->next;
} 
原文地址:https://www.cnblogs.com/hekuiFlye/p/9365639.html