0%

LeetCode题解2

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
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None

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

1nKV5q.png

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
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/


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;
}

1nKn2T.png

题解:

利用链表构造

首先生成根节点root,并记录下来

逐位相加 L1 和 L2,分三种情况:

  1. 在该位上,L1 和 L2 都有数值,计算值为 L1 L2 相加并模10取余,加数超过10,则进位carry为1,加入到下一位的计算中
  2. 在该位上,L1 有值,L2 为空,则计算值为 L1 的值
  3. 在该位上,L2 有值,L1 为空,则计算值为 L2 的值

在结束运算时,注意关注carry的值,此时它是 L1 L2 最高位相加的进位值,若为1,则计算值要进一位

最后返回根节点root中的next指针