0%

2.两数相加

2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:

输入:l1 = [2, 4, 3], l2 = [5, 6, 4]
输出:[7, 0, 8]
解释:342 + 465 = 807

示例 2:

输入:l1 = [0], l2 = [0]
输出:[0]

示例 3:

输入:l1 = [9, 9, 9, 9, 9, 9, 9], l2 = [9, 9, 9, 9]
输出:[8, 9, 9, 9, 0, 0, 0, 1]

C++

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
return dfs(l1, l2, 0);
}

ListNode* dfs(ListNode* l, ListNode* r, int i) {
if (!l && !r && !i) return nullptr;
//可能有l1与l2都为空但carry不为0的情况
int sum = (l ? l->val : 0) + (r ? r->val : 0) + i;
ListNode* node = new ListNode(sum % 10);

//可能有l1与l2都为空但carry不为0的情况
node->next = dfs(l ? l->next : nullptr, r ? r->next : nullptr, sum / 10);
return node;
}
};

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: ListNode, l2: ListNode) -> ListNode:
def dfs(l, r, i):
if not l and not r and not i: return None
s = (l.val if l else 0) + (r.val if r else 0) + i
node = ListNode(s % 10)
# Python中//是模运算,/是整除运算
node.next = dfs(l.next if l else None, r.next if r else None, s // 10)
return node
return dfs(l1, l2, 0)

445. 两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例1:

img

输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]

示例2:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]

示例3:

输入:l1 = [0], l2 = [0]
输出:[0]

提示:

  • 链表的长度范围为 [1, 100]
  • 0 <= node.val <= 9
  • 输入数据保证链表代表的数字无前导 0

C++

class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
stack<int> s1,s2; // 栈顶都是最后一位
while(l1){
s1.push(l1 -> val);
l1 = l1 -> next;
}
while(l2){
s2.push(l2 -> val);
l2 =l2 -> next;
}

ListNode* nxt = nullptr;
int carry = 0;
while(!s1.empty() || !s2.empty()){
ListNode* node = new ListNode(((s1.empty() ? 0 : s1.top()) + (s2.empty() ? 0 : s2.top()) + carry) % 10, nxt);
carry = ((s1.empty() ? 0 : s1.top()) + (s2.empty() ? 0 : s2.top()) + carry) / 10;
if(!s1.empty()) s1.pop();
if(!s2.empty()) s2.pop();
nxt = node;
}
//若没有下句,则输入[5],[5]输出为[0]
if(carry) return new ListNode(carry, nxt);
return nxt;
}
};