Day79 | 灵神 | 反转链表 两数相加 两数相加II
2.两数相加
2. 两数相加 - 力扣(LeetCode)
思路:
笔者一开始想的是在原数组上面进行改动,但是那个不知道两个链表长度就很麻烦,一个链表结束后还得遍历另外一个链表,并且最后返回结果也只能返回长的链表,这真的很麻烦
所以要新创建一个链表,用新创建的链表节点记录val的值
确定循环终止条件:
只要l1 l2 或者进位有一个不为0 那就是要继续循环,继续创建新的节点
也不需要新的变量,用进位carry来记录值即可
最后carry除以10,大于10就是1表示有进位,小于10就是0,也就是没进位
完整代码:
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
| class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode res; ListNode *cur=&res; int carry=0; while(l1 || l2 || carry) { if(l1) { carry+=l1->val; l1=l1->next; } if(l2) { carry+=l2->val; l2=l2->next; } cur->next=new ListNode(carry%10); cur=cur->next; carry/=10; } return res.next; } };
|
445.两数相加II
445. 两数相加 II - 力扣(LeetCode)
思路:
反转链表l1,l2就直接变成两数相加了
得到的结果是l3
再把l3反转就是答案
直接粘贴复制就是了
完整代码:
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| class Solution { public: ListNode* reverseList(ListNode* head) { ListNode *p=head; ListNode *pre=nullptr; while(p!=nullptr) { ListNode* q=p->next; p->next=pre; pre=p; p=q; } return pre; } ListNode* addtwo(ListNode* l1, ListNode* l2) { ListNode res; ListNode *cur=&res; int carry=0; while(l1 || l2 || carry) { if(l1) { carry+=l1->val; l1=l1->next; } if(l2) { carry+=l2->val; l2=l2->next; } cur->next=new ListNode(carry%10); cur=cur->next; carry/=10; } return res.next; } ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { l1 = reverseList(l1); l2 = reverseList(l2); auto l3 = addtwo(l1, l2); return reverseList(l3); } };
|