在本地或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(辅助内存的情况下完成,并通过操纵链表的节点来真正完成任务。