题目:
已知两个非降序链表序列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;
}
}