给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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]
/*** 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) {// 创建一个虚拟节点作为结果链表的头节点ListNode *dummy = new ListNode(0);// 创建一个指针来追踪当前节点ListNode *cur = dummy;// 初始化进位值为0int carry = 0;// 当l1、l2不为空或者还有进位值时进行循环while (l1 || l2 || carry) {// 获取l1当前节点的值,如果l1为空则为0int i1 = l1 ? l1->val : 0;// 获取l2当前节点的值,如果l2为空则为0int i2 = l2 ? l2->val : 0;// 计算当前位的和以及进位值int add = i1 + i2 + carry;// 根据和的大小更新进位值carry = add >= 10 ? 1 : 0;// 如果和大于等于10,则更新和为和减去10add = add >= 10 ? add - 10 : add;// 创建一个新节点,值为和cur->next = new ListNode(add);// 将当前指针移动到下一个节点cur = cur->next;// 如果l1不为空,则将l1指针移动到下一个节点if (l1) {l1 = l1->next;}// 如果l2不为空,则将l2指针移动到下一个节点if (l2) {l2 = l2->next;}}// 返回虚拟节点的下一个节点,即为结果链表的头节点return dummy->next;}
};