2019年PAT乙级秋考B-5链表合并 25分 比较简单的25分题

163 阅读1分钟

题目:1105 链表合并 - PAT (Basic Level) Practice (中文) (pintia.cn)

解析:1105 链表合并 – PAT乙级真题 – 柳婼 の blog (liuchuo.net)

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

struct node
{
   int data;
   int next;
}A[100000];
vector<int>L1,L2,ans;
int main()
{
     int head1,head2,n,tail1,tail2,a;
    cin>>head1>>head2>>n;

    for(int i=0;i<n;i++)
    {
        cin>>a>>A[a].data>>A[a].next;
    }

    //把两个链表分别加入L1,L2
    tail1=head1;
    while(tail1!=-1)
    {
        L1.push_back(tail1);
        tail1=A[tail1].next;
    }
    tail2=head2;
    while(tail2!=-1)
    {
        L2.push_back(tail2);
        tail2=A[tail2].next;
    }

    //ans合并L1,L2
    //先合并长的,保证L1是长的
    if(L1.size()<L2.size())swap(L1,L2);
    for(int i=0,k=L2.size()-1;i<L1.size();i++)  //倒着加入L2
    {
        ans.push_back(L1[i]);

        //奇数的节点就合并L2
        if(i&1&&k>=0)ans.push_back(L2[k--]);  
    }


    //输出部分   不能从0开始,否则i-1会越界
    for(int i=1;i<ans.size();i++)
    {
        printf("%05d %d %05d\n",ans[i-1],A[ans[i-1]].data,ans[i]);
    }

    //尾节点单独输出(因为最后一个数据是 -1  不用%05d的格式)
    printf("%05d %d -1\n",ans.back(),A[ans.back()].data);
    return 0;
}