You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example 1:

Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]
Explanation: 342 + 465 = 807.
Code language: HTTP (http)
Example 2:
Input: l1 = [0], l2 = [0]
Output: [0]
Code language: HTTP (http)
Example 3:
Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
Output: [8,9,9,9,0,0,0,1]
Code language: HTTP (http)
Constraints:
- The number of nodes in each linked list is in the range
[1, 100]. 0 <= Node.val <= 9- It is guaranteed that the list represents a number that does not have leading zeros.
这道题没什么特别难的计算,步骤如下
- 从头循环L1和L2两个链表。
- 如果链表的node还存在,取出该node的val
两个链表的node的val相加,(value1+value2)再加上上一位进位(numberFromLastNode)就是本次的结果 - 这个结果可能> 10 所以我们拿到个位数 (value%10)这个是本次node的val值,然后再拿到需要进位的数(
numberFromLastNode =value//10)用于下一次计算。 - 然后把所有节点向后移动一位,继续计算下一个节点。
- 最后当l1和l2都移动完毕,(not l1 and l2)还剩下的numberFromLastNode可以放在最后一个节点
- 最后返回dummy指向的链表头部。
卡点和注意点是:
- class ListNode要会定义。
- value1 = l1.val if l1 else 0写法要记住
- dummy = node这个设定是linkedList常用设定,因为当node指针移动时我们必须要维持dummy始终留在整个链表的开始部分,如此才能在return时直接返回链表初始节点,不然我们没办法拿到初始节点
- dummy = node并不会让dummy的指针跟着node的值变化,node = node.next时,dummy依然指向链表头部
node.next = ListNode(curr)
node = node.next
...
return dummy.next
是寻常写法。基本上90%的leetcode题都可以这么写。这样可以保证我们返回时不会有多余的节点。
- 也可以有另外一种写法:直接修改node.val然后再生成一个新的ListNode让node.next = ListNode(0)但这样很有可能在链表最后造出一个多余的ListNode,我们需要手动把它消除掉。
- 在最后给出另外一种写法。
- 注意Prev = None只改变Prev本身,不改变链表。Prev.next = None才会改变链表内容。
# 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]:
numberFromLastNode = 0
node = ListNode(0)
dummy = node
while l1 or l2:
value1 = l1.val if l1 else 0
value2 = l2.val if l2 else 0
value = value1 + value2 + numberFromLastNode
curr = value % 10
numberFromLastNode = value // 10
node.next = ListNode(curr)
node = node.next
if l1:
l1 = l1.next
if l2:
l2 = l2.next
if numberFromLastNode > 0:
node.next = ListNode(numberFromLastNode)
return dummy.next
Python# 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]:
numberFromLastNode = 0
node = ListNode(0)
dummy = node
prev = None
# value = 0
while l1 or l2:
value1 = l1.val if l1 else 0
value2 = l2.val if l2 else 0
value = value1 + value2 + numberFromLastNode
node.val = value % 10
numberFromLastNode = value // 10
node.next = ListNode(0)
prev = node
node = node.next
if l1:
l1 = l1.next
if l2:
l2 = l2.next
if numberFromLastNode > 0:
node.val = numberFromLastNode
else:
prev.next = None
return dummy
Python
文章评论