先把两个链表反转后再相加,因为从低位开始做加法比较直观,加法运算完成后再反转整个链表后返回。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
//若任一链表为空,则直接返回另一链表
if (l1 == nullptr || l2 == nullptr) return l1 == nullptr ? l2 : l1;
l1 = reverseList(l1), l2 = reverseList(l2); //反转链表,便于进行加法运算
return reverseList(addList(l1, l2)); //相加后再反转,最后返回结果
}
ListNode* reverseList(ListNode* head) //反转链表模板
{
if (head == nullptr) return head;
ListNode *pre = head, *cur = head->next;
while (cur)
{
ListNode *ne = cur->next;
cur->next = pre;
pre = cur, cur = ne;
}
head->next = nullptr;
return pre;
}
ListNode* addList(ListNode* l1, ListNode* l2) //链表相加
{
ListNode *dummy = new ListNode(0), *p = dummy;
int carry = 0; //进位标志
while (l1 || l2)
{
//链表不为空就将当前的两个节点的值加起来,为空就加0
carry += (l1 == nullptr ? 0 : l1->val) + (l2 == nullptr ? 0 : l2->val);
//如果当前节点有进位,就取模后为1,没有进位就保持原值
//p = p->next = xx 表示 p->next = xx, p = p->next两条语句的组合
p = p->next = new ListNode(carry % 10);
//如果有进位,则carry余1, 没有进位则carry重置为0
carry /= 10;
if (l1) l1 = l1->next;
if (l2) l2 = l2->next;
}
//判断最高位是否有进位,有的话就再追加一个1即可
if (carry) p->next = new ListNode(1);
return dummy->next;
}
};