A1161 PAT甲级
链表合并与反转,输入两个链表,将最短的链表反转后将两链表合并
具体可以看pat网站查看题目要求。AC解答如下:
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
struct node{
int id;
int data;
int next;
}a[100010];
int main(){
int first1,first2,n;
int id,next,data;
scanf("%d %d %d",&first1,&first2,&n);
vector<node>v1,v2;
for(int i=0;i<n;i++){
scanf("%d %d %d",&id,&data,&next);
a[id].id=id;
a[id].data=data;
a[id].next=next;
}
for(int i=first1;i!=-1;i=a[i].next)v1.push_back(a[i]);
for(int i=first2;i!=-1;i=a[i].next)v2.push_back(a[i]);
if(v1.size()<v2.size())swap(v1,v2);//v1设为最长的链表,无需反转
vector<node>ans;
reverse(v2.begin(),v2.end());//反转最小部分的链表
int num1=0,num2=0;
int len=v1.size()+v2.size();//可能输入会有垃圾数据,所以去有效值进行输出
for(int i=0;i<len;i++){
if(num2>=v2.size()||i%3!=2)ans.push_back(v1[num1++]);
else ans.push_back(v2[num2++]);
}
for(int i=0;i<ans.size();i++){
if(i!=ans.size()-1)printf("%05d %d %05d\n",ans[i].id,ans[i].data,ans[i+1].id);
else printf("%05d %d -1\n",ans[i].id,ans[i].data);
}
return 0;
}
总结
关于pat甲级链表部分的题目,难度相对来说较小,用静态链表或者说最好要用静态链表即可解决。最难即反转链表,可用排序解决~