Python 递归地将两个链表中的一个节点合并为一个节点,以构建新的链表
我在尝试编写一个函数时遇到了一些问题,该函数接收两个链表,从两个链表中提取每个节点,将它们组合成一个元组,并构建一个新的链表 应该打印如下内容: (1,2)->(3,4)->(5,6) 这是我所拥有的,我每次运行它都会出错Python 递归地将两个链表中的一个节点合并为一个节点,以构建新的链表,python,recursion,linked-list,Python,Recursion,Linked List,我在尝试编写一个函数时遇到了一些问题,该函数接收两个链表,从两个链表中提取每个节点,将它们组合成一个元组,并构建一个新的链表 应该打印如下内容: (1,2)->(3,4)->(5,6) 这是我所拥有的,我每次运行它都会出错 def pair(head_one, head_two): if head_one is not None or head_two is not None: head = ListNode((head_one.val, head_two.val)) head.
def pair(head_one, head_two):
if head_one is not None or head_two is not None:
head = ListNode((head_one.val, head_two.val))
head.next = pair(head_one.next.val, head_two.next.val)
return head
else:
return None
函数期望其参数为两个ListNode实例,但递归调用将传递
val
属性
因此,改变这一点:
pair(head_one.next.val, head_two.next.val)
为此:
pair(head_one.next, head_two.next)
递归是一种函数遗产,因此将其与函数风格结合使用会产生最好的结果。这意味着避免突变、变量重新分配和其他副作用 使用简单的
节点
类-
类节点:
定义初始值(self,val,next=None):
self.val=val
self.next=下一个
我们为str函数编写了一个,并定义了两个列表,l1
和l2
-
如果输入列表l
为空,则返回列表末尾“EOL”
(感应)l
至少有一个元素。获取第一个元素值的str
表示形式l.val
,并将其与子问题的递归结果l.next
1->3->5->EOL
2->4->6->EOL
现在我们可以编写对
函数了-
如果两个输入列表,a
和b
均为空,则表示我们已达到基本情况。返回一个空列表
(归纳)a
或b
至少有一个元素。如果a
为空,b
至少有一个元素。创建一个新节点(None,b.val)
和子问题的递归结果对(a,b.next)
(感应)a
至少有一个元素。如果b
为空,则创建(a.val,None)
的新节点和子问题的递归结果对(a.next,b)
(感应)a
和b
至少有一个元素。创建(a.val,b.val)
的新节点和子问题的递归结果对(a.next,b.next)
def对(a、b):
如果不是a和b:
返回无#1
如果不是:
返回节点((None,b.val),对(a,b.next))#2
如果不是b:
返回节点((a.val,无),对(a.next,b))#3
其他:
返回节点((a.val,b.val),对(a.next,b.next))#4
打印(对(l1,l2)))
(1,2)->(3,4)->(5,6)->EOL
这类似于链接列表的zip()函数:
迭代地:
def linkedZip(A,B):
result = tail = ListNode(None) # Empty "head" placeholder
while A and B:
tail.next = ListNode((A.val,B.val)) # pair and link values
A,B,tail = A.next,B.next,tail.next # advance lists in parallel
return result.next
或递归地:
def linkedZip(A,B):
if A and B:
paired = ListNode((A.val,B.val))
paired.next = linkedZip(A.next,B.next)
return paired
更简洁地说,如果ListNode构造函数接受下一个节点:
def linkedZip(A,B):
if A and B: return ListNode((A.val,B.val),linkedZip(A.next,B.next))
如果需要压缩到最长的填充元组长度,并且在较短列表的末尾没有填充元组,请执行以下操作:
def linkedZip_longest(A,B):
if A or B:
paired = ListNode((A and A.val,B and B.val))
paired.next = linkedZip_longest(A and A.next,B and B.next)
return paired
或
我已经试过了,这是我一直犯的错误。“AttributeError:‘非类型’对象没有属性‘val’”,那么您的节点是什么样子的?你调试了吗?属性是否真的被称为val
,或者它是value
,或者可能是data
?您是否错过了我的评论?他们还需要将条件从或
更改为和
,以处理基本情况(如果一个列表较长,则截断)。如果OP想要在一个列表更短的情况下继续配对,则需要更多的案例处理。请在问题中添加ListNode
类的定义。
def linkedZip_longest(A,B):
if A or B:
paired = ListNode((A and A.val,B and B.val))
paired.next = linkedZip_longest(A and A.next,B and B.next)
return paired
def linkedZip_longest(A,B):
if A or B: return ListNode((A and A.val,B and B.val),
linkedZip_longest(A and A.next,B and B.next))