LeetCode题解
第2题,两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
原题如上,代码如下:
python版本
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
|
class Solution: def addTwoNumbers(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ root = ListNode(0) node = root carry = 0 while(l1 or l2): x = l1.val if l1 else 0 y = l2.val if l2 else 0 s = carry + x + y carry = s // 10 node.next = ListNode(s%10) node = node.next if(l1!=None): l1 = l1.next if(l2!=None): l2 = l2.next if(carry>0): node.next = ListNode(1) return root.next
|
c语言版本
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
|
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){ int carry = 0; struct ListNode *root; root = (struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode *node = root; while (l1 || l2){ struct ListNode *n = (struct ListNode*)malloc(sizeof(struct ListNode)); n->next = NULL; int x = 0, y = 0; if (l1) x = l1->val; if (l2) y = l2->val; n->val = (x + y + carry)%10; carry = (x + y + carry)/10; node->next = n; node = node->next; if (l1){ l1 = l1->next; }else{ l1 = NULL; } if (l2){ l2 = l2->next; }else{ l2 = NULL; } } if(carry > 0){ struct ListNode *n = (struct ListNode*)malloc(sizeof(struct ListNode)); n->next = NULL; n->val = 1; node->next = n; } return root->next; }
|
题解:
利用链表构造
首先生成根节点root,并记录下来
逐位相加 L1 和 L2,分三种情况:
- 在该位上,L1 和 L2 都有数值,计算值为 L1 L2 相加并模10取余,加数超过10,则进位carry为1,加入到下一位的计算中
- 在该位上,L1 有值,L2 为空,则计算值为 L1 的值
- 在该位上,L2 有值,L1 为空,则计算值为 L2 的值
在结束运算时,注意关注carry的值,此时它是 L1 L2 最高位相加的进位值,若为1,则计算值要进一位
最后返回根节点root中的next指针