PAT 1032 合并链表的首个相同元素
题目分析:
本题虽然题目中用的suffix,但是实际上是只要有相同的段,该段就会合并为同一个链表,因此本题实际上是求一个合并链表的 首个公共元素。
在建立链表时,可以比较轻松地统计合并点(即每个公共段的第一个公共点),但是第一个公共点不一定是合并点,还有可能是两个链表中的一个开始结点,这样讨论起来是比较麻烦的。
实际上可以直接先从一个链表的开始结点开始遍历,对遍历过的每个结点都进行标记,完成后再从另一个链表的开始结点遍历,遇到的第一个已标记结点就是我们要求的首个相同元素。
代码:
#include <iostream>
#include <map>
#include <vector>
#include <set>
#include <iomanip>
using namespace std;
struct node{
char val;
int next;
int flg = 0;
};
map<int,vector<node>> m;
int main(){
int s1,s2,n;
cin>>s1>>s2>>n;
for(int i = 0;i < n;i++){
int tmp;
node temp;
cin>>tmp>>temp.val>>temp.next;
m[tmp].push_back(temp);
}
int start = s1;
while(start != -1){
m[start][0].flg = 1;
start = m[start][0].next;
}
start = s2;
while(start != -1){
if(m[start][0].flg == 1){
cout<<setw(5)<<setfill('0')<<start<<endl;
return 0;
}
start = m[start][0].next;
}
cout<<-1<<endl;
return 0;
}
142 ms