Python 兩數相加 Leetcode No.2
思路很簡單,模擬小學加法運算就好了,因為是逆序的,頭指針指向的那個其實就是個位,往后加就完事,但是唯一需要注意的是,最高位可能有進位。(屬于代碼練習題)
ps:還有人說先把數全部取出來,用計算機加法算完,再建立鏈表連接起來,乍一看有點投機取巧好像可行的樣子,但是我們要考慮計算和的時候會溢出。
還有人考慮直接在原來的鏈表上改數字,多一位的話,就再加一個鏈表,首先不知道leetcode允不允許改數字,畢竟這種題目也是考察你的鏈表能力,其次就算可以改,也沒那個必要,畢竟就算少個幾百個節點,問題也不大就是了。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class
Solution
(
object
)
:
def
addTwoNumbers
(
self
,
l1
,
l2
)
:
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
#進位
add
=
0
#這是兩個頭節點
l3
=
l4
=
ListNode
(
0
)
while
True
:
#算節點的和
if
l1
or
l2
:
if
l1
:
sum
=
l1
.
val
+
add
if
l2
:
sum
+=
l2
.
val
elif
l2
:
sum
=
l2
.
val
+
add
if
l1
:
sum
+=
l1
.
val
else
:
sum
=
add
add
=
0
#判斷是否給add賦值
if
sum
//
10
>
0
:
add
=
1
sum
%=
10
#為新節點賦值
l3
.
val
=
sum
l1
=
l1
.
next
if
l1
else
l1
l2
=
l2
.
next
if
l2
else
l2
#創建新的鏈表
if
l1
or
l2
or
add
:
l3
.
next
=
ListNode
(
0
)
l3
=
l3
.
next
else
:
break
return
l4
ps:分享很多國外人寫的代碼,就感覺臥槽,還可以這么寫,思路大家都一樣,寫法會有很多不同哦
#第一個老外寫的,用了str
class
Solution
:
def
addTwoNumbers
(
self
,
l1
,
l2
)
:
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
str_l1
,
str_l2
=
''
,
''
while
l1
:
str_l1
+=
str
(
l1
.
val
)
l1
=
l1
.
next
while
l2
:
str_l2
+=
str
(
l2
.
val
)
l2
=
l2
.
next
int_l1
=
int
(
str_l1
[
:
:
-
1
]
)
int_l2
=
int
(
str_l2
[
:
:
-
1
]
)
return
list
(
map
(
int
,
str
(
int_l1
+
int_l2
)
[
:
:
-
1
]
)
)
#第二個老外寫的,用了divmod,有點意思哈
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class
Solution
(
object
)
:
def
addTwoNumbers
(
self
,
l1
,
l2
)
:
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
result
=
ListNode
(
0
)
result_tail
=
result
carry
=
0
while
l1
or
l2
or
carry
:
val1
=
(
l1
.
val
if
l1
else
0
)
val2
=
(
l2
.
val
if
l2
else
0
)
carry
,
out
=
divmod
(
val1
+
val2
+
carry
,
10
)
result_tail
.
next
=
ListNode
(
out
)
result_tail
=
result_tail
.
next
l1
=
(
l1
.
next
if
l1
else
None
)
l2
=
(
l2
.
next
if
l2
else
None
)
return
result
.
next
#第三個老外用了遞歸寫的,可以看看
# Definition for singly-linked list.
class
ListNode
(
object
)
:
def
__init__
(
self
,
x
)
:
self
.
val
=
x
self
.
next
=
None
def
printList
(
nodeStart
)
:
print
(
nodeStart
.
val
)
if
nodeStart
.
next
==
None
:
return
else
:
printList
(
nodeStart
.
next
)
class
Solution
(
object
)
:
def
addTwoNumbers
(
self
,
l1
,
l2
)
:
if
l1
==
None
:
return
l2
if
l2
==
None
:
return
l1
sval
=
l1
.
val
+
l2
.
val
if
sval
<
10
:
ansNode
=
ListNode
(
sval
)
ansNode
.
next
=
self
.
addTwoNumbers
(
l1
.
next
,
l2
.
next
)
return
ansNode
else
:
rval
=
l1
.
val
+
l2
.
val
-
10
ansNode
=
ListNode
(
rval
)
ansNode
.
next
=
self
.
addTwoNumbers
(
ListNode
(
1
)
,
self
.
addTwoNumbers
(
l1
.
next
,
l2
.
next
)
)
return
ansNode
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
