首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为了以相反的顺序合并2个排序链接列表,我得到AttributeError 'NoneType‘对象对于一些测试用例没有属性'next’。为什么

为了以相反的顺序合并2个排序链接列表,我得到AttributeError 'NoneType‘对象对于一些测试用例没有属性'next’。为什么
EN

Stack Overflow用户
提问于 2021-07-09 05:42:08
回答 2查看 114关注 0票数 0

我正在观看为极客们举办的按反向顺序合并2排序链接列表实践挑战赛:

给出了两个大小为NM的链表,它们按非递减顺序排序.任务是以这样一种方式合并它们,使结果列表按递减顺序排列。 输入: 第一行输入包含测试用例数T。对于每个测试用例,第一行输入分别获得两个链表N和M的长度。接下来的两行包含两个链表的N和M元素。 输出: 对于每个测试用例,打印合并链接列表,该列表的顺序不增加. 用户任务: 任务是完成函数mergeResult(),该函数引用两个链接列表的头部,并返回指向合并链接列表的指针。

我的方法

我试图首先按升序合并列表,然后将其反转。它适用于大多数测试用例,但失败的情况很少,错误如下:

第21行,在mergeResult中 p3=p3.next AttributeError:'NoneType‘对象没有属性'next’

代码语言:javascript
运行
复制
def mergeResult(h1,h2):
    p1=h1
    p2=h2
    node=Node(-1)
    p3=node
    while p1!=None and p2!=None:
        if p1.data<p2.data:
            p3.next=p1
            p1=p1.next
        elif p2.data<p1.data:
            p3.next=p2
            p2=p2.next
        p3=p3.next
    if p1!=None:
        p3.next=p1
    if p2!=None:
        p3.next=p2
    head=node.next
    curr=head
    prev=None
    next=None
    while curr:
        next=curr.next
        curr.next=prev
        prev=curr
        curr=next
    head=prev
    return head

我在这里做错什么了?对这个问题还有什么别的办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-09 07:00:21

问题就在这一行上:

代码语言:javascript
运行
复制
elif p2.data<p1.data:

这里不应该有条件,因为你想处理所有剩下的案子。现在,您没有处理p2.data等于p1.data的情况。因此,将上面的行更改为:

代码语言:javascript
运行
复制
else:

这将解决这个问题。

替代方案

有一种更短的方法来实现这个结果:而不是在第二阶段逆转列表,而是直接按反向顺序插入节点。这样,您就可以在一个循环而不是两个循环中处理作业。然后,只要其中一个引用不是None,您就应该继续循环,这样while条件就变成了or。然后,在if条件下,您需要考虑其中一个可能是None。最后,您实际上不需要引入p1p2变量:只需使用已经给定的h1h2

这个解决方案也不需要临时的“哨兵”节点(值为-1的节点)。

代码语言:javascript
运行
复制
def mergeResult(h1,h2):
    result = None
    while h1 or h2:
        if not h2 or (h1 is not None and h1.data < h2.data):
            h1.next, result, h1 = result, h1, h1.next
        else:
            h2.next, result, h2 = result, h2, h2.next
    return result

因此,在这里,h1 (或h2)位于当前结果列表的前面。在对其进行预处理之后,将结果引用放入该预置节点。多个赋值使得h1 (或h2)在调整该节点的next引用之前仍将步行到(原始)下一个节点。当然,您也可以通过单独的赋值来完成这一任务,但是接下来需要一个临时变量:

代码语言:javascript
运行
复制
def mergeResult(h1,h2):
    result = None
    while h1 or h2:
        if not h2 or (h1 is not None and h1.data < h2.data):
            nxt = h1.next
            h1.next = result
            result = h1
            h1 = nxt
        else:
            nxt = h2.next
            h2.next = result
            result = h2
            h2 = nxt
    return result
票数 0
EN

Stack Overflow用户

发布于 2021-07-09 05:53:14

在mergeResult的while循环中,您需要检查p1.data == p2.data。目前,您没有检查它,所以当p1.data == p2.data时,p3.next没有被设置(因此它的默认值为None)。这意味着p3被设置为None,并且正如错误显示的那样,p3.next (即None.next)无法工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68311810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档