我正在观看为极客们举办的按反向顺序合并2排序链接列表实践挑战赛:
给出了两个大小为
N
和M
的链表,它们按非递减顺序排序.任务是以这样一种方式合并它们,使结果列表按递减顺序排列。 输入: 第一行输入包含测试用例数T。对于每个测试用例,第一行输入分别获得两个链表N和M的长度。接下来的两行包含两个链表的N和M元素。 输出: 对于每个测试用例,打印合并链接列表,该列表的顺序不增加. 用户任务: 任务是完成函数mergeResult()
,该函数引用两个链接列表的头部,并返回指向合并链接列表的指针。
我的方法
我试图首先按升序合并列表,然后将其反转。它适用于大多数测试用例,但失败的情况很少,错误如下:
第21行,在mergeResult中 p3=p3.next AttributeError:'NoneType‘对象没有属性'next’
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
我在这里做错什么了?对这个问题还有什么别的办法吗?
发布于 2021-07-09 07:00:21
问题就在这一行上:
elif p2.data<p1.data:
这里不应该有条件,因为你想处理所有剩下的案子。现在,您没有处理p2.data
等于p1.data
的情况。因此,将上面的行更改为:
else:
这将解决这个问题。
替代方案
有一种更短的方法来实现这个结果:而不是在第二阶段逆转列表,而是直接按反向顺序插入节点。这样,您就可以在一个循环而不是两个循环中处理作业。然后,只要其中一个引用不是None
,您就应该继续循环,这样while
条件就变成了or
。然后,在if
条件下,您需要考虑其中一个可能是None
。最后,您实际上不需要引入p1
和p2
变量:只需使用已经给定的h1
和h2
。
这个解决方案也不需要临时的“哨兵”节点(值为-1的节点)。
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
引用之前仍将步行到(原始)下一个节点。当然,您也可以通过单独的赋值来完成这一任务,但是接下来需要一个临时变量:
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
发布于 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)无法工作。
https://stackoverflow.com/questions/68311810
复制相似问题