AcWing 4273 链表合并
给定两个单链表$ L_1 = a_1 \to a_2 \to … \to a_{n-1} \to a_n $和$ L_2 = b_1 \to b_2 \to … \to b_{m-1} \to b_m$,满足:$n \ge 2m$。
你的任务是将较短的那个链表逆序,然后将之并入较长的链表,得到形如$ a_1 \to a_2 \to b_m \to a_3 \to a_4 \to b_{m-1} … $的结果。
例如给定两个链表分别为 $6 \to 7$ 和 $1 \to 2 \to 3 \to 4 \to 5$,你应该输出 $1 \to 2 \to 7 \to 3 \to 4 \to 6 \to 5$。
补充 本题中可能包含不在两个单链表中的节点,这些节点无需考虑。
输入格式
输入首先在第一行中给出两个链表 $L_1$ 和 $L_2$ 的头结点的地址,以及正整数 N,即给定的结点总数。
一个结点的地址是一个 5 位数的非负整数(可能包含前导 0),空地址 NULL
用 -1 表示。
随后 N 行,每行按以下格式给出一个结点的信息:
Address Data Next
其中 Address
是结点的地址,Data
是不超过 10^5 的正整数,Next
是下一个结点的地址。
题目保证没有空链表,并且较长的链表至少是较短链表的两倍长。
输出格式
按顺序输出结果链表,每个结点占一行,格式与输入相同。
数据范围
$ 1 \le N \le 10^5 $
输入样例:
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
题解:
本题主要是对链表进行操作,可以使用列表进行模拟操作。在init()
函数中使用列表模拟链表对数据进行储存,之后通过列表切片快速实现列表逆序。由于在a
和b
列表在pop
时会删除列表中最后一个元素,又因为将较短的那个链表逆序,然后将之并入较长的链表
所以仅需要将a
列表进行逆序即可,可是使用列表切片进行操作,虽然切片空间消耗更大,但是时间上更快。
Python代码实现:
def init():
val, ne = {}, {}
L1, L2, n = input().split()
for _ in range(int(n)):
L, v, next = input().split()
ne[L], val[L] = next, v
a, b = [], []
while L1 != '-1':
a.append(L1)
L1 = ne[L1]
while L2 != '-1':
b.append(L2)
L2 = ne[L2]
if len(a) < len(b):
a, b = b, a
a = a[::-1]
return a, b, val, ne
def prin(a, b, val, ne):
while len(a):
print(a[-1], val[a[-1]], ne[a[-1]])
a.pop()
if len(b):
print(a[-1], val[a[-1]], b[-1])
print(b[-1], val[b[-1]], ne[a[-1]])
a.pop() and b.pop()
def main():
a, b, val, ne = init()
prin(a, b, val, ne)
if __name__ == '__main__':
main()