2. Add Two Numbers
请看题

例子

思路
一开始的思路是获取到链表的最后一个元素,然后从后到前来算结果,但是这样子想好像做不到。
后面看了解题的视频,发现有一个惊为天人的解法!
我们只需要相加每一个链表当前的节点,如果有进位,比如7+8 -> 15,就把这个1放到下一个节点来进行相加。根据这个思路我们就可以开始解题了。
首先如果传入的两个链表有一个为空,那么直接返回另外一个。
然后定义一个result,一个当前节点,一个进位值。
当两个链表都不为空并且进位不等于0的时候进入循环,在循环内算有无进位,如果有,当前节点的下一个节点取模,再把进位 / 10.
最后只需要把链表的指针移到下一个就好了
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| /** * 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; } };
|