试图解决LeetCode“添加两个数字”。
您将得到两个表示两个非负整数的非空链表。这些数字按反向顺序存储,它们的每个节点都包含一个数字。将这两个数字相加,并将和作为一个链接列表返回。您可以假设这两个数字不包含任何前导零,除了数字0本身。
我编写了一个处理列表的程序,而LeetCode提供了ListNode。不幸的是,我无法理解ListNode力学(如何迭代,如何获得长度等等)。所以我决定把它转换成清单。请帮助我如何做到这一点,如何遍历所有的ListNode,并将所有这些值放到常规列表中,反之亦然: list -> ListNode,以便以正确的类型返回我的答案。
下面是我的代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
l3 = [] #resulting list
shift = 0
# HERE goes code for: ListNode -> List
if len(l1) > len(l2):
l_long = l1
l_short = l2
else:
l_long = l2
l_short = l1
谢谢!
发布于 2021-09-24 12:18:14
这个问题不需要你使用常规列表。由于列表是以“反向顺序”存储的,这实际上是有帮助的,因为您会在两个列表之间单独添加数字,然后计算/携带溢出(从左向右移动)。例如,添加链接列表[5, 1] + [5]
将导致您将一个节点添加到生成的列表[0,
中,然后迭代到下一个位置,继续执行10s数字,然后从输入执行1,从上一次迭代的进位执行1,得到2
,因此结果是[0, 2]
。如果你把一个1变成9,那么你再把进位数向前移动。
此外,如果你要建立一个常规列表,你也可以转换成一个int,相反,做数学,然后把int变成链表.
但是,要将LinkedList转换为常规列表,而不将LinkedList类本身作为可迭代类型,则如下所示
ll = ListNode(...)
l = []
n = ll
while n is not None:
l.append(n.val)
n = n.next
否则,如果它是正确的Python可迭代类型,则[n.val for n in ll]
发布于 2021-09-24 12:17:43
发布于 2021-09-24 12:49:33
您可以使用以下方法将可迭代性修补到这些链接列表中:
def ll_iter(node):
while node:
yield node.val
node = node.next
ListNode.__iter__ = ll_iter
那么,在您的代码中,您只需做:
l1 = list(l1)
但是,我认为直接使用链接列表编写递归解决方案是最简单的。您甚至不会遇到递归深度问题,因为列表保证最多有100个节点。
https://stackoverflow.com/questions/69314767
复制相似问题