链表——两个有序链表序列的交集

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。

输入格式:

输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用表示序列的结尾(不属于这个序列)。数字用空格间隔。

输出格式:

在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL

输入样例:

1 2 5 -1
2 4 5 8 10 -1

输出样例:

2 5
#include<bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct LNode *List;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
} LNode,*LinkList;

Status InitList(LinkList &L)
{
    L = new LNode;
    L -> next = NULL;
    return OK;
}
Status IsEmpty(LinkList &L)
{
    if(L == NULL || L -> next == NULL)
    {
        return OK;
    }
    else
        return ERROR;
}
Status CreatList(LinkList &L)
{
    LNode *p,*q;
    L = new LNode;
    L -> next  = NULL;
    q = new LNode;
    p = L;
    ElemType tmp;
    cin>>tmp;
    while(tmp != -1)
    {
        q -> data = tmp;
        q -> next = NULL;
        p -> next = q;
        p = q;
        q = new LNode;
        cin>>tmp;
    }
}
void PrintList(LinkList &L)
{
    LNode *p = L ->next;
    while(p)
    {
        if(p -> next == NULL)
        {
            cout<<p -> data<<endl;
        }
        else
            cout<<p -> data<<" ";
        p = p -> next;
    }
}
//需O(min(N1,N2))时间。
//可以令结点指针P1指向S1的首结点,
//P2指向S2首结点,不断比较P1与P2所指结点的值:
//若两结点值相等,则创建新结点将这个值插入到新链表S3的末尾,
//并将P1与P2分别往前移(P=P->next);
//若不相等,将较小结点的对应结点指针往前移。
//创建结点时,注意用malloc函数申请内存;
//由于每次总是插入S3末尾,可以用指针变量pRear指向S3尾结点,
//添加新结点时插入pRear结点之后并更新pRear。
void IntersectList(LinkList &L1,LinkList &L2,LinkList &L3)
{
    LNode *p1,*p2,*p3,*p;
    p1= L1 -> next;
    p2 = L2 ->next;
    p3 = L3;
    while(p1 && p2)
    {
        if(p1 -> data < p2 -> data)
        {
            p1 = p1 -> next;
        }
        else if(p1 -> data > p2 -> data)
        {
            p2 = p2 -> next;
        }
        else if(p1 -> data == p2 -> data)
        {
            p = new LNode;
            p -> data = p1 -> data;
            p -> next = NULL;
            p3 -> next = p;
            p3 = p;
            p1 = p1 -> next;
            p2 = p2 -> next;
        }
    }
}

int main()
{
    LinkList L1,L2,L3;
    InitList(L1);
    InitList(L2);
    InitList(L3);

    CreatList(L1);
    CreatList(L2);

    IntersectList(L1,L2,L3);
    if(IsEmpty(L3))
    {
        cout<<"NULL"<<endl;
    }
    else
        PrintList(L3);
}




猜你喜欢

转载自blog.csdn.net/Yolanda_Salvatore/article/details/78856652
今日推荐