7-6 两个有序链表序列的交集

 7-6 两个有序链表序列的交集 (20 分)

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

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

2 5
#include<bits/stdc++.h>
using namespace std;

typedef struct Node
{
    int data;
    Node* next;
    Node(int data):data(data),next(NULL) {}
} List;

List* readL()   ///读取数据并创建链表
{
    int x;
    List *L=new List(INT_MIN);
    List *p,*r=L;
    scanf("%d",&x);
    while(x!=-1)
    {
        p=new List(x);
        r->next=p;
        r=p;
        scanf("%d",&x);
    }
    return L;
}

void DispList(List *L)    ///打印链表
{
    if(L->next==NULL) printf("NULL\n");
    else
    {
        List *p=L->next;
        while(p)
        {
            if(p->next)
                printf("%d ",p->data);
            else
                printf("%d",p->data);
            p=p->next;
        }
        printf("\n");
    }
}

/*
List* mergeL(List *L1,List *L2)     ///合并两个有序链表的代码
{
    List *pre,*i=L1->next,*j=L2->next;
    List *L=new List(INT_MIN);
    pre=L;
    while(i && j)
    {
        if(i->data<j->data)
        {
            pre->next=i;
            pre=i;
            i=i->next;
        }
        else{
            pre->next=j;
            pre=j;
            j=j->next;
        }
    }
    if(i) pre->next=i;
    if(j) pre->next=j;
    return L;
}
*/

///版本一:找两个链表的交集元素,并创建该链表,非有序也可用
/*
List *newL(List *L1,List *L2)
{
    List *L=new List(INT_MIN);
    List *i=L1->next,*j=L2->next,*pre=L;
    while(i)
    {
        while(j)
        {
            if(i->data==j->data)
            {
                pre->next=i;
                pre=i;
                break;
            }
            j=j->next;
        }
        j=L2->next;
        i=i->next;
        //printf("YES\n");
    }
    return L;
}
*/

///版本二:只适用于两个有序链表
List *newL(List *L1,List *L2)
{
    List *L=new List(INT_MIN);
    List *i=L1->next,*j=L2->next,*pre=L;
    while(i && j)
    {
        if(i->data<j->data) i=i->next;
        else if(i->data>j->data) j=j->next;
        else
        {
            pre->next=i;
            pre=i;
            i=i->next;
            j=j->next;
        }
     }
    return L;
}
int main()
{
    List *L1=readL();
    List *L2=readL();
    List *L=newL(L1,L2);
    DispList(L);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/armerzu/article/details/82913595