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()函数中使用列表模拟链表对数据进行储存,之后通过列表切片快速实现列表逆序。由于在ab 列表在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()
 
posted @ 2022-06-13 15:25  devon-dlq  阅读(24)  评论(0)    收藏  举报