不同的输出在本地和leetcode上运行相同的代码



在本地或repl中运行这段代码。它会输出正确的结果,但在提交时在leetcode中运行时会抛出错误


def create_linked_lst(lst):
linked_lst = ListNode()
tmp = linked_lst
if len(lst) == 0:
tmp.val = ''
return linked_lst

for item in lst:
if lst.index(item) < len(lst)-1:
tmp.val = item 
#print ("__> ",tmp.val)
tmp.next = ListNode()
tmp = tmp.next
tmp.val = lst[-1]
#print ("__> ",tmp.val)
return linked_lst

class Solution:
def mergeTwoLists(self , l1, l2):

lst1 = [] 
lst2 = [] 
def linked_lst_to_lst(lst):
tmp = []
while lst.next != None:
tmp.append(lst.val)
lst = lst.next
tmp.append(lst.val)
return tmp

lst1 = linked_lst_to_lst(l1)
lst2 = linked_lst_to_lst(l2)
lst = sorted(lst1+lst2)
print (lst)

return create_linked_lst(lst)

l1 = create_linked_lst([1,2,4])
l2 = create_linked_lst([1,3,4])

#while l1.next != None:
#  print (l1.val)
#  l1 = l1.next
#print (l1.val)
test = Solution()
test.mergeTwoLists(l1,l2)

在类外取消注释while循环时,输出为

[1,1,2,3,4,4]
Your input
[1,2,4]
[1,3,4]
stdout
[1, 1, 2, 3, 4, 4]
Output
[1,1,2,3,4,4,4]
Expected
[1,1,2,3,4,4]

当提交给leetcode时,只有mergeTwoLists方法的主体与create_linked_lst一起复制

以下行有问题:

if lst.index(item) < len(lst)-1:

应该没有理由去寻找该值的索引。此外,当列表中存在重复项时,这不会给出当前索引。由于您的示例结果有一个重复的4,因此最后一项也将添加到循环中的列表中,并在循环后再次

事实上,这种逻辑过于复杂:实际上不需要首先创建一个空节点,然后在下一次迭代中填充其值。

这里有一个将标准列表转换为链表的更优雅的解决方案:以反转的顺序迭代输入列表,将该值预置到您正在构建的链表中。ListNode的构造函数还允许将引用传递给下一个节点,当您反向构建链表时,下一个结点实际上是链表的状态。

这导致了这个代码:

def create_linked_lst(lst):
linked_lst = None
for item in reversed(lst):
linked_lst = ListNode(item, linked_lst)
return linked_lst

还要注意,在任何情况下都不会创建以''为值的节点。Leet Code会期望您在实际结果链表没有节点时返回None

最后备注

您可以通过将链接列表转换为标准列表来解决Leet Code难题。这是可行的,但这种挑战的目的是在没有O(n(辅助内存的情况下完成,并通过操纵链表的节点来真正完成任务。

相关内容

  • 没有找到相关文章

最新更新