Python 递归地将两个链表中的一个节点合并为一个节点,以构建新的链表

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.

我在尝试编写一个函数时遇到了一些问题,该函数接收两个链表,从两个链表中提取每个节点,将它们组合成一个元组,并构建一个新的链表

应该打印如下内容: (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.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))