python版——>leetcode 02:两数相加(python)
题目
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:2. 两数相加 - 力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处 。
进位提取法
- 在两个链表不同时为空时,循环执行以下步骤:
在链表对应数不为空时,取其中的数分别为a、b,为空则为0;
令 s = r e s + a + b ( 0 < s < 20 ) s=res+a+b(0<s<20) s=res+a+b(0<s<20)
再令 r e s res res为 s s s的十位上数 ( r e s = 1 o r 0 ) (res=1 or 0) (res=1or0),作为下一个循环的进位;
将 s s s个位上数存入新链表
循环结束后:
若 r e s res res不为0,在新链表中添加一值为1的节点作为最高位。
代码如下:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* myhead = new ListNode(0);
ListNode* node = myhead;
int res=0;
while(l1 || l2)
{
int x = l1 ? l1->val : 0;
int y = l2 ? l2->val : 0;
int s = res+x+y;
res = s / 10;
node->next = new ListNode(s%10);
node = node->next;
if(l1) l1 = l1->next;
if(l2) l2 = l2->next;
}
if(res)
node->next = new ListNode(1);
return myhead->next;
}
};
结果:(速度更快的也都是这个思路,无非是代码写得更完善)