8000 add python solution for 001 · xiaokai1996/LeetCode-1@4f5c70e · GitHub
[go: up one dir, main page]

Skip to content

Commit 4f5c70e

Browse files
committed
add python solution for 001
1 parent dd9b545 commit 4f5c70e

File tree

2 files changed

+76
-16
lines changed

2 files changed

+76
-16
lines changed

001. Add Two Numbers/README.md

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,43 @@
1-
这道题让我想起之前的 [Add Binary](../87. Add Binary). 思想几乎类似,难点在于**进位**
1+
# 思路(C++)
22

3-
其次,这种关系到两个链表的问题,dummy 节点应该是必不可少的了
3+
这道题让我想起之前的 [Add Binary](../66. Add Binary). 思想几乎类似,难点在于**进位**
44

5-
以上两点,便是这道题的核心。私以为,本题难度应为 Easy.
5+
其次,这种关系到两个链表的问题,dummy 节点应该是必不可少的了。
6+
7+
以上两点,便是这道题的核心。私以为,本题难度应为 Easy.
68

79
-----
810

9-
具体说一下进位的事情。
11+
具体说一下进位的事情。
1012

11-
STL 有一个专门的结构体叫做 `div_t`, 其包含两个成员,分别是 quot(quotient) 与 rem(remainder). 用来做什么,从命名上是否可以看出一点端倪呢?
13+
STL 有一个专门的结构体叫做 `div_t`, 其包含两个成员,分别是 quot(quotient) 与 rem(remainder). 用来做什么,从命名上是否可以看出一点端倪呢?
1214

13-
举例说明.
15+
举例说明.
1416

1517
38 / 5 == 7 remainder 3
1618

17-
用 C++ 来描述,便是:
19+
用 C++ 来描述,便是:
1820

1921
div_t result = div(38, 5);
2022
cout << result.quot << result.rem;
2123

22-
前者为被除后的结果,后者为余数。
24+
前者为被除后的结果,后者为余数。
2325

2426
-----
2527

26-
与这道题的关系是?
28+
与这道题的关系是?
2729

28-
本题的进位是基于十进制的,故两个节点相加之后的值,应判断是否超出了10,超出需要进位,留下的是余数。即,做了 div 操作后。sum.rem 是新链表的当前节点,sum.quot 是下一次加法运算的进位。
30+
本题的进位是基于十进制的,故两个节点相加之后的值,应判断是否超出了10,超出需要进位,留下的是余数。即,做了 div 操作后。sum.rem 是新链表的当前节点,sum.quot 是下一次加法运算的进位。
2931

30-
有:
32+
有:
3133

3234
```cpp
33-
if (l1) { sum.quot += l1->val; l1 = l1->next; } // 进位 + l1
34-
if (l2) { sum.quot += l2->val; l2 = l2->next; } // 进位 + l1 + l2
35-
sum = div(sum.quot, 10); // 除 10 操作,得到新的 quot 与 rem.
36-
tail->next = new ListNode(sum.rem); // rem 为节点值, quot 留作下次迭代
37-
```
35+
if (l1) { sum.quot += l1->val; l1 = l1->next; } // 进位 + l1
36+
if (l2) { sum.quot += l2->val; l2 = l2->next; } // 进位 + l1 + l2
37+
sum = div(sum.quot, 10); // 除 10 操作,得到新的 quot 与 rem.
38+
tail->next = new ListNode(sum.rem); // rem 为节点值, quot 留作下次迭代
39+
```
40+
41+
## Python
42+
43+
STL 里的 `div` 方法对应 Python 里的 [`divmod`](https://docs.python.org/3/library/functions.html#divmod). 其等同于 (a // b, a % b). 其余的思路一致,不过 Python 里似乎不方便取地址直接修改内存,只好用傀儡节点的方法替代。

001. Add Two Numbers/solution.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#!python3
2+
3+
4+
# Definition for singly-linked list.
5+
class ListNode:
6+
def __init__(self, x):
7+
self.val = x
8+
self.next = None
9+
10+
11+
class Solution:
12+
def addTwoNumbers(self, l1, l2):
13+
"""
14+
:type l1: ListNode
15+
:type l2: ListNode
16+
:rtype: ListNode
17+
"""
18+
head = ListNode(0)
19+
p = head
20+
quot = 0
21+
while l1 or l2 or quot != 0:
22+
if l1:
23+
quot += l1.val
24+
l1 = l1.next
25+
if l2:
26+
quot += l2.val
27+
l2 = l2.next
28+
quot, rem = divmod(quot, 10)
29+
p.next = ListNode(rem)
30+
p = p.next
31+
32+
return head.next
33+
34+
35+
def co A32A mpareLinkedList(l1, l2):
36+
while l1 or l2:
37+
if not (l1 and l2) or l1.val != l2.val:
38+
return False
39+
l1 = l1.next
40+
l2 = l2.next
41+
return True
42+
43+
44+
if __name__ == "__main__":
45+
l1 = ListNode(2)
46+
l1.next = ListNode(4)
47+
l1.next.next = ListNode(3)
48+
l2 = ListNode(5)
49+
l2.next = ListNode(6)
50+
l2.next.next = ListNode(4)
51+
lsum = ListNode(7)
52+
lsum.next = ListNode(0)
53+
lsum.next.next = ListNode(8)
54+
print(compareLinkedList(Solution().addTwoNumbers(l1, l2), lsum))

0 commit comments

Comments
 (0)
0