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

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

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

输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5

这道题需要四个部分,我们分别来看
第一个,创建一个链表来容纳一个链表的值
第二个,创建另一个链表,来容纳另一个链表的值
第三个,创立一个用于容纳交集的链表3
将链表1和链表2的值进行比较,然后将相同的数放入链表3
第四个,创立一个用于输出值的函数。

第一步:

点击查看代码
struct Node(){               //定义节点
   int data;
   node *next;
};
typedef node *list;         //改名


List ListCreat()
{
  list L,Head;
  Head = new (struct Node);    //先创立一个头节点叫Head,在给Head配齐装备(数据域和指针域内存位置)后,
  Head->next=NULL;
   L=Head;                     //令L和Head成为一个东西,这种感觉,就像是给Head找了个替身,在后面,既可以用L来往后面扩充
int data;                      //又可以保住Head这个头节点的地址域,作为这个链表的起点(头位置不变,在头位置的基础上查找,便于使 
                              //用) 
while(cin>>data,data != -1){    //之后进入一个循环,在循环中创建新的节点,并赋值 
   list Newlist = new (struct Node);
   Newlist->data = data;        //将新的节点加入到以Head为头节点的链表中
   Newlist->next = NULL;
   L->next = Newlist;          //用L这个指针作为连接的那个啥
   L = L->next;                //这一行和上一行的目的是便于在链表后边加入新的节点。
} 
   return Head;
}

通过上面的函数,可以创建L1,L2两个链表
现在需要将他们两个链表取交集

点击查看代码
list union(list L1,list L2){
     L1 = L1->next;
     L2 = L2->next;
     list L,Head;
     Head = new (struct node);    //刚才写这个的时候忘了定义这个新的并集L了
     Head ->next = NULL;          //这里只是简单先定义好一个头节点
     L = Head;
 while(L1->data != NULL&&L2->data != NULL){   //条件注意是L1,L2不为空,而不是data不为空,数据什么时候都不为空
     if(L1->data > L2->data){
            L2 =  L2->data
         }
     else if(L1->data < L2->data){
            L1 =  L1->data
         }
     else{
           list newnode = new(struct node);   
           newnode->next = NULL;
           newnode->data = L1->data;
           L->next= newnode;     //这里是将newnode加入已经建好的L里面,所以直接应用L会出现问题
           L = L->next;
           L1 = L1->next;
           L2 = L2->next;
        }

}
   return Head;                 //千万别忘了这个返回值!!!!!
}

最后一步也就是把新得的交集L给输出出来,也就是遍历出来,借助一个新建的函数

点击查看代码
void Print(List L){        //这个函数比完整代码中的更加简单,因为原理就是遍历
    L = L->next;           //不要忘了这个声明;
    if(L==NULL){
        cout<<"NULL";
    }
    else{
      while(L->next != NULL){
           cout<<L->data<<' ';
           L=L->next;
          }cout<<L->data;
    }
}

完全代码:

点击查看代码
#include <bits/stdc++.h>
using namespace std;
struct Node {
    int data;
    struct Node *next;
};
using List = struct Node *;
List CreateList();
List Union(List L1, List L2);
void Print(List L);
int main()
{
    List L1, L2, L;
    L1 = CreateList();
    L2 = CreateList();
    L = Union(L1, L2);
    Print(L);
    return 0;
}

List CreateList()
{
    List L, Head;
    Head = new (struct Node);
    Head->next = nullptr;
    L = Head;
    int data;
    while (cin >> data, data != -1) {
        List NewNode = new (struct Node);
        NewNode->data = data;
        NewNode->next = nullptr;
        L->next = NewNode;
        L = L->next;
    }
    return Head;
}
List Union(List L1, List L2)
{
    L1 = L1->next;
    L2 = L2->next;
    List L, Head;
    Head = new (struct Node);
    Head->next = nullptr;
    L = Head;
    while (L1 != nullptr && L2 != nullptr) {
        if (L1->data > L2->data) {
            L2 = L2->next;
        } 
        else if (L1->data < L2->data) {
            L1 = L1->next;
        }
        else {
            List NewNode = new (struct Node);
            NewNode->data = L1->data;
            NewNode->next = nullptr;
            L->next = NewNode;
            L = L->next;
            L1 = L1->next;
            L2 = L2->next;
        }
    } 
    return Head;
}
void Print(List L) 
{
    L = L->next;
    int cnt = 0;
    if (L == nullptr) {
        cout << "NULL" << endl;
        return;
    }
    while (L != nullptr) {
        if (cnt == 0) {
            cout << L->data;
        } 
        else {
            cout << " " << L->data;
        }
        cnt += 1;
        L = L->next;
    }
}

posted on 2024-04-04 19:31  fafrkvit  阅读(29)  评论(1编辑  收藏  举报