每日leetcode(28)
- 两数相加,题目如下:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
这道题不能直接相加在拆开,这样会溢出,所以直接另寻他法,模拟进制,相加不大于10直接取和,相加大于10取零头,最后如果要进位则在末尾加1,代码如下:
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
p=ListNode(0)
q=p
flag=0#进位标志
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
while l1 and l2:
self.addList(l1.val,l2.val)
l1=l1.next
l2=l2.next
while l1:#当l2空
self.addList(l1.val,0)
l1=l1.next
while l2:#当l1空
self.addList(l2.val,0)
l2=l2.next
if self.flag:#在末尾需要进位
self.p.next=ListNode(1)
return self.q.next
#模拟进制
def addList(self,x:int,y:int):
if self.flag:
sum=x+y+1
else:
sum=x+y
if sum<10:
self.flag=0
self.p.next=ListNode(sum)
self.p=self.p.next
else:
self.flag=1
self.p.next=ListNode(sum-10)
self.p=self.p.next
效率还行吧,最好有98