给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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]
主要思路为: 另外创建一个链表用于记录计算后的结果, 其中算相加运算的时候需要注意就是进位情况的处理。
class Solution {
public:
// 需要注意的就是要处理进位 的情况即可
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* p1 = l1;
ListNode* p2 = l2;
ListNode *d = new ListNode(-1); // 虚拟头结点(构建新链表时的常用技巧)
ListNode *p = d;
// 记录进位
int carry = 0;
while(p1!=nullptr || p2 != nullptr || carry >0) // 需要确保l1,l2都遍历完 以及进位为0的情况下才能停
{
int value = carry; // 进位的那些数可以放在新的一次循环的加法中加入运算
if(p1!=nullptr){
value += p1->val;
p1 = p1->next;
}
if(p2 != nullptr){
value += p2->val;
p2 = p2->next;
}
int result = value%10;
carry = value/10;
p->next = new ListNode(result); // 创建新的计算出来结果的节点
p = p->next;
}
return d->next;
}
};
创建个伪头节点能够减少很多麻烦(代码量), 相信大家在学习数据结构的时候都应该有所领会。
如果有什么想说的, 欢迎在下方评论区留下你的发言噢。谢谢大家。~