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