pat 甲级1161链表合并
题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/1478635524918910976
还有7分钟上体育,抓紧写完题解,不罗嗦;
题目大意:给定两个链表,如果满足cnt1(链表1的长度)>=2*cnt2;就将短的哪一方按照每三个插进去一个然后短链表还要从末尾开始例如
链表1:6→7
链表2:1→2→3→4→5
合并结果就是:1→2→7→3→4→6→5.
题目分析:用晴神教的静态链表写即可,并且引入三个数组来表示链表1的地址,链表2的地址以及合并后每个节点的地址
最后输出表示即可,如果发现cnt2>cnt1要记得将两者位置互换
参考代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 //#define int long long 4 //#define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); 5 const int N=1e5+10; 6 struct node 7 { 8 int key; 9 int ne; 10 }l[N]; 11 vector<int>a; 12 vector<int>b; 13 vector<int>c; 14 int n,f1,f2; 15 /*int cnt1; 16 int cnt2;*/ 17 int main() 18 { 19 //IOS; 20 scanf("%d %d %d",&f1,&f2,&n); 21 int x,y,z; 22 for(int i=1;i<=n;i++) 23 { 24 scanf("%d %d %d",&x,&y,&z); 25 l[x].key=y; 26 l[x].ne=z; 27 } 28 for(int i=f1;~i;i=l[i].ne) 29 { 30 a.push_back(i); 31 //cnt1++; 32 } 33 for(int j=f2;~j;j=l[j].ne) 34 { 35 b.push_back(j); 36 //cnt2++; 37 } 38 if(a.size()<b.size()) 39 swap(a,b); 40 for(int i=0,j=b.size()-1;i<a.size();i++) 41 { 42 c.push_back(a[i]); 43 if(i%2==1&&j>=0) 44 c.push_back(b[j--]); 45 } 46 for(int i=1;i<c.size();i++) 47 { 48 printf("%05d %d %05d\n",c[i-1],l[c[i-1]].key,c[i]); 49 if(i==c.size()-1) 50 printf("%05d %d -1",c[i],l[c[i]].key,-1); 51 } 52 return 0; 53 }
tip:还有长宽不要忘记,我调了好久.......
本文来自博客园,作者:江上舟摇,转载请注明原文链接:https://www.cnblogs.com/LQS-blog/p/16649564.html