首先,这道题整体还是比较简单的,只要把握题意,仔细思考,我相信各位小伙伴都可以战胜它!
首先,我们还是先阅读题目:
输入: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]
题意分析:
首先,此函数接收两个链表 l1 和 l2,并返回一个新的链表,该链表表示两个输入列表的总和。大概的题意就是这样。接下来,我们具体分析。
解题思路:
本题整体上的思想即为:使用初等数学的方法,采用逐位累加的策略对其进行操作。
图解如下:
代码如下:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(-1); //设置哨兵位结点
ListNode* newHead = dummy; //用于遍历新的链表所用
int carry = 0; //进位标识符
while (l1 || l2 || carry) { //循环将继续,直到输入列表和进位值都为空
int n = l1 ? l1->val: 0;
int m = l2 ? l2->val: 0;
int sum = n+ m + carry;
//在每次迭代中,我们添加当前节点的值和进位值
carry = sum / 10;
//创建一个数值为【sum % 10】的新节点,并将其设置当前结点的下一个结点
newHead->next = new ListNode(sum % 10);
newHead = newHead->next; //更新当前节点的位置
//往后进行迭代操作
l1 = l1 ? l1->next : NULL;
l2 = l2 ? l2->next : NULL;
}
return dummy->next; //最后,我们返回哨兵位节点的下一个节点,即新列表的头部。
}
};
到此,本题便讲解结束!!!