合并两个按次序递增的单链表成为一个递减的单链表

题目

两个按元素递增次序排列的单链表,编写算法将两个单链表合并为一个按元素递减次序排列的单链表
并要求利用原来两个单链表的结点存放归并后的单链表

代码

 //两个按元素递增次序排列的单链表,编写算法将两个单链表合并为一个按元素递减次序排列的单链表
//并要求利用原来两个单链表的结点存放归并后的单链表

#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct LNode{
    
    
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;
void createLinkList(LinkList &L){
    
    
    L=(LNode *)malloc(sizeof(LNode));
    LNode *p,*r=L;
    ElemType e;
    cin>>e;
    while(e!=999){
    
    
        p=(LNode *)malloc(sizeof(LNode));
        p->data=e;
        r->next=p;
        r=p;
        cin>>e;
    }
    r->next=NULL;
}
void dispLinkList(LinkList L){
    
    
    LNode *p=L->next;
    while(p){
    
    
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
}
//算法主体
//使用头插法构造链表
void MergeAandB(LinkList &LA,LinkList &LB){
    
    
    if(LA==NULL&&LB==NULL)
        return;
    LNode *pa=LA->next,*pb=LB->next,*q;
    LA->next=NULL;
    while(pa&&pb){
    
    
        if(pa->data<pb->data){
    
    
            q=pa->next; //暂存pa的后继,防止断链
            pa->next=LA->next;
            LA->next=pa;
            pa=q;
        }else{
    
    
            q=pb->next;
            pb->next=LA->next;
            LA->next=pb;
            pb=q;
        }
    }
    while(pa){
    
    
        q=pa->next;
        pa->next=LA->next;
        LA->next=pa;
        pa=q;
    }
    while(pb){
    
    
        q=pb->next;
        pb->next=LA->next;
        LA->next=pb;
        pb=q;
    }
    
}
int main() {
    
    
    LinkList LA,LB;
    createLinkList(LA);
    createLinkList(LB);
    dispLinkList(LA);
    dispLinkList(LB);
    MergeAandB(LA,LB);
    dispLinkList(LA);

    return 0;
}

实现效果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/niulinbiao/article/details/127872922