日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

7-52 两个有序链表序列的交集 (20 分)(思路加详解尾插法)come Boby!

發布時間:2023/12/4 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 7-52 两个有序链表序列的交集 (20 分)(思路加详解尾插法)come Boby! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一:題目

已知兩個非降序鏈表序列S1與S2,設計函數構造出S1與S2的交集新鏈表S3。

輸入格式:
輸入分兩行,分別在每行給出由若干個正整數構成的非降序序列,用?1表示序列的結尾(?1不屬于這個序列)。數字用空格間隔。

輸出格式:
在一行中輸出兩個輸入序列的交集序列,數字間用空格分開,結尾不能有多余空格;若新鏈表為空,輸出NULL。

輸入樣例:

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

輸出樣例:

2 5

二:思路

1.首先是儲存數據,我用的是尾插法
2.考慮如何找出交集,需要注意的是,題目說的是非降序為(即后一個一定比前一個值大),那么我們在處理交集合的時候,就可以用到了比較元素大小,直接讓指針指向后一個,而不用擔心前一個會被忽略,因為兩個序列均為非降序

三:上碼

#include<bits/stdc++.h> using namespace std;typedef struct Node* Link; typedef struct Node{int data;Link next; }nnode;//輸入鏈表(尾插法) Link createLink(){Link head = (Link)malloc(sizeof(struct Node));Link rear;rear = head;while(1){int num;cin >> num;if(num == -1)break;Link p = (Link)malloc(sizeof(struct Node));p->data = num;rear->next = p;rear = p; }rear->next = NULL;return head; }Link newLink(Link L1,Link L2){Link l1 = L1->next;Link l2 = L2->next;//新建一個鏈表 存的元素為交集Link head = (Link)malloc(sizeof(struct Node));Link rear;rear = head; while(l1 && l2){//題目給出的非降序(即后一個一定比前一個值大) if(l1->data > l2->data){l2 = l2->next;}else if(l1->data < l2->data){l1 = l1->next; }else if(l1->data == l2->data){Link p = (Link)malloc(sizeof(struct Node));p->data = l1->data;rear->next = p;rear = p; l1 = l1->next;l2 = l2->next; //return 0;} } rear->next = NULL;return head;} void printLink(Link L){Link l = L->next;//頭結點并未賦值,所以要用頭結點的下一個結點if(l == NULL){cout << "NULL";}int flag = 0;while(l){if(flag == 0)cout << l->data;elsecout << ' ' << l->data;flag = 1; l = l->next;} }int main(){Link L1 = createLink();Link L2 = createLink();Link L3 = newLink(L1,L2);printLink(L3);}

四:其他做法的失敗碼

1:用了vector容器(最后一個點超時)

#include<bits/stdc++.h> using namespace std;int main(){vector<int>v1,v2,v3;set<int>s[2];set<int>::iterator st;while(1){int temp1; cin >> temp1;if(temp1 == -1)break;v1.push_back(temp1);}while(1){int temp2; cin >> temp2;if(temp2 == -1)break;v2.push_back(temp2);}//判斷相同的元素int num1 = v1.size() > v2.size() ? v1.size() : v2.size();//求出較大的值int num2 = v1.size() < v2.size() ? v1.size() : v2.size();//求出較小的值for(int i = 0; i < num2; i++){for( int j = 0; j < num1; j++){if(v1[i] == v2[j]){v3.push_back(v1[i]);break;}}} if(v3.size() != 0){for(int i = 0; i < v3.size(); i++){if(i != v3.size() - 1){cout << v3[i] << ' '; }else{cout << v3[i];}}}else{cout << "NULL";}}

2:用了set容器(超時解決了但最后一個測試點 答案錯誤 吐了)

#include<bits/stdc++.h> using namespace std;int main(){vector<int>v1,v2,v3;set<int>s[2];set<int>::iterator st;while(1){int temp1; cin >> temp1;if(temp1 == -1)break;s[0].insert(temp1);}while(1){int temp2; cin >> temp2;if(temp2 == -1)break;s[1].insert(temp2);}//判斷相同的元素for(st = s[0].begin(); st != s[0].end(); st++){if(s[1].find(*st) != s[1].end()){//如果是s[1]容器中沒有*t這個元素的話,那么就 v3.push_back(*st); //返回 s[1].end(); 但現在是 != s[1].end();// 那么的話就是存在*t; }} if(v3.size() != 0){for(int i = 0; i < v3.size(); i++){if(i != v3.size() - 1){cout << v3[i] << ' '; }else{cout << v3[i];}}}else{cout << "NULL";}}

3:用了map容器(超時解決了但最后一個測試點過不去(答案錯誤)狗比PTA氣死我了)

#include<bits/stdc++.h> using namespace std;int main(){vector<int>v3;map<int,int>m;map<int,int>::iterator t;while(1){int temp1; cin >> temp1;if(temp1 == -1)break;m[temp1] = 1;}while(1){int temp2; cin >> temp2;if(temp2 == -1)break;m[temp2] += 1;}for(t = m.begin(); t != m.end(); t++){if(t->second == 2){v3.push_back(t->first);}}if(v3.size() != 0){for(int i = 0; i < v3.size(); i++){if(i != v3.size() - 1){cout << v3[i] << ' '; }else{cout << v3[i];}}}else{cout << "NULL";}}

五:總結

加油BOY! 畢竟這道題人家讓用的就是鏈表,所以還是老老實實用來鏈表吧!!!!!!!!!!!!!!!!

總結

以上是生活随笔為你收集整理的7-52 两个有序链表序列的交集 (20 分)(思路加详解尾插法)come Boby!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。