首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将ListNode从LeetCode转换为常规列表?

如何将ListNode从LeetCode转换为常规列表?
EN

Stack Overflow用户
提问于 2021-09-24 12:07:09
回答 3查看 6.4K关注 0票数 2

试图解决LeetCode“添加两个数字”。

您将得到两个表示两个非负整数的非空链表。这些数字按反向顺序存储,它们的每个节点都包含一个数字。将这两个数字相加,并将和作为一个链接列表返回。您可以假设这两个数字不包含任何前导零,除了数字0本身。

我编写了一个处理列表的程序,而LeetCode提供了ListNode。不幸的是,我无法理解ListNode力学(如何迭代,如何获得长度等等)。所以我决定把它转换成清单。请帮助我如何做到这一点,如何遍历所有的ListNode,并将所有这些值放到常规列表中,反之亦然: list -> ListNode,以便以正确的类型返回我的答案。

下面是我的代码:

代码语言:javascript
运行
复制
# 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

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2021-09-24 12:18:14

这个问题不需要你使用常规列表。由于列表是以“反向顺序”存储的,这实际上是有帮助的,因为您会在两个列表之间单独添加数字,然后计算/携带溢出(从左向右移动)。例如,添加链接列表[5, 1] + [5]将导致您将一个节点添加到生成的列表[0,中,然后迭代到下一个位置,继续执行10s数字,然后从输入执行1,从上一次迭代的进位执行1,得到2,因此结果是[0, 2]。如果你把一个1变成9,那么你再把进位数向前移动。

此外,如果你要建立一个常规列表,你也可以转换成一个int,相反,做数学,然后把int变成链表.

但是,要将LinkedList转换为常规列表,而不将LinkedList类本身作为可迭代类型,则如下所示

代码语言:javascript
运行
复制
ll = ListNode(...)

l = []
n = ll
while n is not None:
    l.append(n.val)
    n = n.next

否则,如果它是正确的Python可迭代类型,则[n.val for n in ll]

票数 3
EN

Stack Overflow用户

发布于 2021-09-24 12:17:43

您应该在代码开始时阅读文档,因为它为您提供了有关链接列表的说明。如果这还不够,我建议你检查一下。将链接列表转换为常规列表将使任务变得毫无意义。有关链接列表的更多信息,请参见

简而言之,链接列表满足了无限数据结构的需求(当然,没有数据结构实际上是无限的,但是链接列表肯定比数组允许更多的灵活性)。链表由节点组成,每个节点指向下一个节点,最后一个节点指向null。这样,如果您想要延长您的列表,您只需创建一个新节点并使最后一个节点指向它。此外,每个节点都有一个值。在问题中给出的实现中,self.val是每个节点的值持有者,self.next是指向下一个节点的指针。

票数 1
EN

Stack Overflow用户

发布于 2021-09-24 12:49:33

您可以使用以下方法将可迭代性修补到这些链接列表中:

代码语言:javascript
运行
复制
def ll_iter(node):
    while node:
        yield node.val
        node = node.next
ListNode.__iter__ = ll_iter

那么,在您的代码中,您只需做:

代码语言:javascript
运行
复制
l1 = list(l1)

但是,我认为直接使用链接列表编写递归解决方案是最简单的。您甚至不会遇到递归深度问题,因为列表保证最多有100个节点。

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

https://stackoverflow.com/questions/69314767

复制
相关文章

相似问题

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