思路
考查点
思路:
正序遍历的时候顺便记录他的前缀节点,双向链表的思路。 然后将两个链表合并到vector中,利用vector输出结果。
AC代码
# include <iostream>
# include <vector>
using namespace std;
const int N = 1e5 + 5 ;
struct node {
int add, data, next, pre;
} E[ N] ;
void print ( int head, int tail) {
vector< node> res;
int count = 0 ;
auto p = head, q = tail;
while ( p != - 1 ) {
count++ ;
res. push_back ( E[ p] ) ;
p = E[ p] . next;
if ( count% 2 == 0 && q != - 1 ) {
res. push_back ( E[ q] ) ;
q = E[ q] . pre;
}
}
int n = res. size ( ) ;
for ( int i = 0 ; i < n; i++ ) {
printf ( "%05d %d " , res[ i] . add, res[ i] . data) ;
if ( i == n- 1 ) printf ( "-1\n" ) ;
else printf ( "%05d\n" , res[ i+ 1 ] . add) ;
}
}
int main ( ) {
int L1, L2, n;
cin >> L1>> L2>> n;
int add, data, next;
for ( int i = 0 ; i < n; i++ ) {
cin >> add>> data>> next;
E[ add] = { add, data, next, - 2 } ;
}
int len1 = 0 ;
auto p = L1;
int pre = - 1 ;
while ( p != - 1 ) {
len1++ ;
E[ p] . pre = pre;
pre = p;
p = E[ p] . next;
}
int len2 = 0 ;
auto q = L2;
int pre2 = - 1 ;
while ( q != - 1 ) {
len2++ ;
E[ q] . pre = pre2;
pre2 = q;
q = E[ q] . next;
}
if ( len1 > len2) {
print ( L1, pre2) ;
} else {
print ( L2, pre) ;
}
return 0 ;
}