Python 兩數(shù)相加 Leetcode No.2
思路很簡(jiǎn)單,模擬小學(xué)加法運(yùn)算就好了,因?yàn)槭悄嫘虻模^指針指向的那個(gè)其實(shí)就是個(gè)位,往后加就完事,但是唯一需要注意的是,最高位可能有進(jìn)位。(屬于代碼練習(xí)題)
ps:還有人說先把數(shù)全部取出來,用計(jì)算機(jī)加法算完,再建立鏈表連接起來,乍一看有點(diǎn)投機(jī)取巧好像可行的樣子,但是我們要考慮計(jì)算和的時(shí)候會(huì)溢出。
還有人考慮直接在原來的鏈表上改數(shù)字,多一位的話,就再加一個(gè)鏈表,首先不知道leetcode允不允許改數(shù)字,畢竟這種題目也是考察你的鏈表能力,其次就算可以改,也沒那個(gè)必要,畢竟就算少個(gè)幾百個(gè)節(jié)點(diǎn),問題也不大就是了。
# 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
"""
#進(jìn)位
add
=
0
#這是兩個(gè)頭節(jié)點(diǎn)
l3
=
l4
=
ListNode
(
0
)
while
True
:
#算節(jié)點(diǎn)的和
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
#為新節(jié)點(diǎn)賦值
l3
.
val
=
sum
l1
=
l1
.
next
if
l1
else
l1
l2
=
l2
.
next
if
l2
else
l2
#創(chuàng)建新的鏈表
if
l1
or
l2
or
add
:
l3
.
next
=
ListNode
(
0
)
l3
=
l3
.
next
else
:
break
return
l4
ps:分享很多國(guó)外人寫的代碼,就感覺臥槽,還可以這么寫,思路大家都一樣,寫法會(huì)有很多不同哦
#第一個(gè)老外寫的,用了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
]
)
)
#第二個(gè)老外寫的,用了divmod,有點(diǎn)意思哈
# 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
#第三個(gè)老外用了遞歸寫的,可以看看
# 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
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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