链表和数组

Linked List and array

我知道 Whosebug 不会写问题并获取答案站点,但这是我的 leetcode 问题。

l1 = input()
l2 = input()
def f(x): #Gives reversed of linkedlist ex. [2, 4, 3] return 342
    a, u = 0, 0
    for ele in x:
        if ele.isnumeric():
            a += int(ele)*(10**u)
            u += 1
    return a
l = list(int(i) for i in str(f(l1) + f(l2)))
print(list(reversed(l)))

这个问题是 leet code problem 所以我在这里解决了这个问题,但这是不同的,他们不希望逗号后的数字之间有空格。

不过,我也试过了

k = str(f(l1) + f(l2))
print("[" + ",".join(str(k)[::-1]) + "]")

这只是列表的默认表示,每个逗号后有一个 space

x = [1, 2, 3]
print(x)                        # [1, 2, 3]  type is list
print(str(x).replace(" ", ""))  # [1,2,3]    type is str

你不应该在 leetcode 上使用 input() 和 print()

当你开始一道题时,他们会给你一个你必须填写的函数和 return 结果。

class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        #put your code here
        return the_result

这道题应该使用节点定义为

的链表
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next

这应该是您应该编码的 addTwoNumbers() 方法的输入。

但不知何故,通过使用 input(),您可以绕过它并获取原始列表。

此外,打印(标准输出)不是 leetcode 系统正在评估的内容,它们寻找 addTwoNumbers() 的输出,在本例中为空白。

这是完整的解决方案;

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next

class Solution:
    def __init__(self):
        self.head = None

    def rev(self, ls):
        res = []

        self.head = ls
        while self.head:
            res.append(str(self.head.val))
            self.head = self.head.next

        return list(reversed(res))
    
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        res1 = int(''.join(self.rev(l1)))
        res2 = int(''.join(self.rev(l2)))
        
        res3 = str(res1 + res2)
        resls = list(reversed([i for i in res3]))
        
        self.head = ListNode(resls[0], None)
        finalres = self.head
        for i in range(1, len(resls)):
            lsn = ListNode(resls[i], None)
            finalres.next = lsn
            finalres = finalres.next
            
        return self.head 
        
**Explanation**:

我假设您了解链表的基础知识,即它们是什么(如果您有困惑,请发表评论)。

所以在解决方案 class 中,我只是在其 __init__ 方法中定义了一个 self.head 属性,我将使用它来跟踪链表中的元素。它最初设置为 None,因为那里我们没有任何数据。

然后我定义了一个rev方法来反转给定的链表。

在 rev 中,我创建了一个空列表 res 来存储提供的链接列表中的数据。

Rev 也将链表作为参数,因为我将从中获取数据并将其附加到 res 列表

所以我把 self.head 等于我们调用该方法时提供的链表 ls。

然后我简单地 运行 一个 while 循环直到 self.head 被定义(即,直到它不是 None,这意味着仍然有数据)。

每次迭代后,我不断将self.head更改为self.head。next在链表中向前移动并从该链表的每个节点获取数据并将其附加到res列表。

最后我只是return编辑了反转的res.

然后我定义了另一个方法,addTwoNumbers,它接受两个链表,return根据要求求和。

首先,我需要这两个链表为整数形式并反转(根据条件)。所以我使用 rev 方法来反转它们,使用 join 方法(python 中的内置方法来连接字符串列表)将列表转换为字符串,然后使用 int 方法将字符串转换为 int。

我对两个链表都做了同样的操作,并分别将它们存储在 res1 和 res2 中。

然后我将它们的和 (res3) 转换为字符串,因为我们不能遍历整数。

然后我将 res3 转换为反向列表。

现在是最后一步,return整个事情作为一个列表节点。

所以我简单地创建了一个 ListNode 的实例;

self.head = ListNode(resls[0], None)

这将创建一个 ListNode 实例,其中数据作为 resls 的第一个元素,下一个元素为 none。

然后我将它存储在另一个变量中以引用同一个实例并且不更改它。

然后运行对剩余元素进行远循环并继续添加数据和下一个。

希望你明白。谢谢