请看题
例子
思路
一开始的思路是获取到链表的最后一个元素,然后从后到前来算结果,但是这样子想好像做不到。
后面看了解题的视频,发现有一个惊为天人的解法!
我们只需要相加每一个链表当前的节点,如果有进位,比如7+8 → 15,就把这个1放到下一个节点来进行相加。根据这个思路我们就可以开始解题了。
首先如果传入的两个链表有一个为空,那么直接返回另外一个。
然后定义一个result,一个当前节点,一个进位值。
当两个链表都不为空并且进位不等于0的时候进入循环,在循环内算有无进位,如果有,当前节点的下一个节点取模,再把进位 / 10.
最后只需要把链表的指针移到下一个就好了
代码
/**
* 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) {
if(!l1) {return l2;}
if(!l2) {return l1;}
ListNode result(0);
ListNode *current = &result;
int carry = 0;
while (l1 || l2 || carry != 0){
carry += (l1 ? l1->val : 0) + (l2 ? l2->val : 0);
current->next = new ListNode(carry % 10);
carry = carry / 10;
current = current->next;
l1 = l1 ? l1->next : nullptr;
l2 = l2 ? l2->next : nullptr;
}
return result.next;
}
};