1105 链表合并
给定两个单链表 L1=a1→a2→⋯→an−1→an 和 L2=b1→b2→⋯→bm−1→bm。如果 n≥2m,你的任务是将比较短的那个链表逆序,然后将之并入比较长的那个链表,得到一个形如 a1→a2→bm→a3→a4→bm−1⋯ 的结果。例如给定两个链表分别为 6→7 和 1→2→3→4→5,你应该输出 1→2→7→3→4→6→5。
输入格式:
输入首先在第一行中给出两个链表 L1 和 L2 的头结点的地址,以及正整数 N (≤10的5次方),即给定的结点总数。一个结点的地址是一个 5 位数的非负整数,空地址 NULL 用 -1 表示。
随后 N 行,每行按以下格式给出一个结点的信息:
Address Data Next
其中 Address 是结点的地址,Data 是不超过 10的5次方的正整数,Next 是下一个结点的地址。题目保证没有空链表,并且较长的链表至少是较短链表的两倍长。
输出格式:
按顺序输出结果链表,每个结点占一行,格式与输入相同。
输入样例:
00100 01000 7
02233 2 34891
00100 6 00001
34891 3 10086
01000 1 02233
00033 5 -1
10086 4 00033
00001 7 -1
输出样例:
01000 1 02233
02233 2 00001
00001 7 34891
34891 3 10086
10086 4 00100
00100 6 00033
00033 5 -1
代码长度限制 16 KB
时间限制 200 ms
内存限制 64 MB
/*
1105 链表合并
https://pintia.cn/problem-sets/994805260223102976/exam/problems/1478634321389170688
*/
#include <iostream>
#include <string.h>
#include <vector>
using namespace std;
struct LNode
{
int val;
int nextAddress;
LNode(){}
LNode(int v,int nA):val(v),nextAddress(nA){}
};
struct FullLNode
{
int currentAddress;
int val;
int nextAddress;
FullLNode(){}
FullLNode(int cA,int v,int nA):currentAddress(cA),val(v),nextAddress(nA){}
};
int main()
{
int num,firstAddress_01,firstAddress_02;//节点数量,两个链表的首地址
cin>>firstAddress_01>>firstAddress_02>>num;
vector<int> valuesLink1;
vector<FullLNode> fullNodes;
LNode nodes[100001],result[100001];
memset(nodes, 0, sizeof(nodes));
memset(result, 0, sizeof(result));
//接收所有的链表节点
for(int i=0;i<num;i++)
{
int address,val,nextAddress;
cin>>address>>val>>nextAddress;
nodes[address].val=val;
nodes[address].nextAddress=nextAddress;
}
//先保存链表1中的节点信息
int length_link1=0;//记录链表1的长度
for (int i=firstAddress_01;i!=-1;i=nodes[i].nextAddress)
{
length_link1++;
fullNodes.push_back(FullLNode(i,nodes[i].val,nodes[i].nextAddress));
}
firstAddress_01=fullNodes[fullNodes.size()-1].currentAddress;
//逆置链表1的值
while(length_link1>0)
{
int k=fullNodes[length_link1-1].currentAddress;
nodes[k].val=fullNodes[length_link1-1].val;
if(length_link1-2>=0)
nodes[k].nextAddress=fullNodes[length_link1-2].currentAddress;
else
nodes[k].nextAddress=-1;
length_link1--;
}
//再次进行合并
int i=firstAddress_02,j=firstAddress_01,count=0;
while(i!=-1||j!=-1)
{
count++;
if(i!=-1)
{
if(count%2!=0)
{
printf("%05d %d",i,nodes[i].val);
if(nodes[i].nextAddress!=-1)
printf(" %05d\n",nodes[i].nextAddress);
else
printf(" -1\n");
}
else
{
printf("%05d %d",i,nodes[i].val);
if(j!=-1)//如果链表1不空,将下个节点指向链表1
{
printf(" %05d\n",j);
}
else//为空指向下个节点
{
if(nodes[i].nextAddress!=-1)
printf(" %05d\n",nodes[i].nextAddress);
else
printf(" -1\n");
}
}
}
if(count%2==0)
{
if(j!=-1)
{
printf("%05d %d",j,nodes[j].val);
if(nodes[i].nextAddress!=-1)//如果链表1不空,将下个节点指向链表1
{
printf(" %05d\n",nodes[i].nextAddress);
}
else//为空指向下个节点
{
if(nodes[j].nextAddress!=-1)
printf(" %05d\n",nodes[i].nextAddress);
else
printf(" -1\n");
}
}
if(j!=-1)
j=nodes[j].nextAddress;
}
if(i!=-1)
i=nodes[i].nextAddress;
}
}