寻找两个递增有序链表的交集

寻找两个递增有序链表的交集

利用两个指针p、q遍历两个链表,当p的元素等于q的元素值时,添加进入结果链表中,如果p的数据小于q的数据时,p向下移动,否则q向下移动

实现代码

#include 
#include 
#include

typedef int Elemtype;

typedef struct LNode
{
    Elemtype data;
    struct  LNode *next;
} LNode,*LinkList;




LinkList List_TailInsert(LinkList L)
{
    int x;
    L=(LinkList)malloc(sizeof(LinkList));//创建头节点
    L->next=NULL;

    LNode *r=L,*s;
    scanf("%d",&x);
    while(x!=9999)
    {
        s=(LNode*)malloc(sizeof(LNode*));
        s->data=x;
        r->next=s;
        r=s;
        scanf("%d",&x);
    }
    r->next=NULL;
    return L;
}


LinkList List_HeadInsert(LinkList L)
{
    LNode *s;
    int x;
    L=(LinkList)malloc(sizeof(LNode));

    L->next=NULL;
    scanf("%d",&x);
    while(x!=9999)
    {
        s=(LNode*)malloc(sizeof(LNode));
        s->data=x;
        s->next=L->next;
        L->next=s;
        scanf("%d",&x);
    }
    return L;
}
void PrintLinkList(LinkList L)
{
    printf("打印链表\n");
    LNode *r=L->next;
    while(r!=NULL)
    {
        printf("%d--->",r->data);
        r=r->next;
    }
    printf("\n");
}


LinkList Get_Union(LinkList A,LinkList B)
{
    LNode *p=A->next,*q=B->next;//p、q用来遍历
    LNode *s=A;//保留A链表
    LNode *u;//用于删除结点
    while(p&&q)
    {
        if(p->data==q->data)
        {
            s->next=p;//将p结点尾插入s
            s=p;
            p=p->next;
            u=q;
            q=q->next;
            free(u);
        }else if(p->data<q->data){ //谁小谁删除
            u=p;
            p=p->next;
            free(u);
        }else{
            u=q;
            q=q->next;
            free(u);
        }
    }
    while(p)
    {
        u=p;
        p=p->next;
        free(u);
    }
    while(q)
    {
        u=q;
        q=q->next;
        free(u);
    }
    s->next=NULL;
    free(B);//删除B的头节点
    return A;
}


int main()
{

    //A、B一定有序
    LinkList A;//头指针,创建链表
    printf("创建链表,输入链表的值 9999表示结束!\n");
    A=List_TailInsert(A);
    PrintLinkList(A);
    printf("创建链表,输入链表的值 9999表示结束!\n");
    LinkList B;
    B=List_TailInsert(B);
    PrintLinkList(B);
    printf("寻找A、B的交集\n");
    A=Get_Union(A,B);
    PrintLinkList(A);

    return 0;
}


你可能感兴趣的:(考研数据结构模板,链表,数据结构,list)