python输入两个数求和_【Leetcode】2:两数相加(Python)

题目:

1363478-20200905214756611-914199253.png

解题思路:首先对两个链表进行遍历,然后将数字转化为字符串加起来

然后对整个字符串进行逆序,在逆序的同时赋值给新创建的链表

代码如下:

#Definition for singly-linked list.#class ListNode:#def __init__(self, x):#self.val = x#self.next = None

classSolution:def addTwoNumbers(self, l1: ListNode, l2: ListNode) ->ListNode:#首先对两个链表进行遍历,然后将数字转化为字符串加起来

#然后对整个字符串进行逆序,在逆序的同时赋值给新创建的链表

#首先考虑为0的情况

#考虑链表不为0的情况

l1_node=[]

l2_node=[]#在储存进数组里的时候可以直接逆序

whilel1:

l1_node.insert(0,str(l1.val))

l1=l1.nextwhilel2:

l2_node.insert(0,str(l2.val))

l2=l2.next#转化为整数进行相加

zhengshu=''zhengshuer=''

for i inl1_node:

zhengshu=zhengshu+ifor j inl2_node:

zhengshuer=zhengshuer+j

zhengshu=int(zhengshu)

zhengshuer=int(zhengshuer)

summ=str(zhengshu+zhengshuer)#将相加得到的整数再次变成字符串,并分割,分别赋值给新的链表

ls=[]for i insumm:

ls.append(i)

node=ListNode(0)

pointer=node#这里还要进行倒序一次

i=len(ls)-1

while i>=0:

node.next=ListNode(int(ls[i]))

node=node.next

i=i-1

return pointer.next

得解:

1363478-20200905214946045-521901214.png

我这个方法还不太行,时间复杂度太大,用了四个并列的循环,之后再来想想有没有更好的办法。

方法二:

然后我看了官方的解答,直接使用初等数学方法求解,如下图所示:

1363478-20200906095629365-966455395.png

我们可以观察到链表l1和l2正好从前往后遍历得到的是个位,十位,百位数的数字位数,我们只要把遍历的结果从前往后分别相加到一个新的链表里就正好得到了我们新链表的结果,使用carry代表是否进位,carry=1就进位,carry=0就不进位。同时考虑,两个链表长度不相同的情况,于是可写出以下代码:

#Definition for singly-linked list.#class ListNode:#def __init__(self, x):#self.val = x#self.next = None

classSolution:def addTwoNumbers(self, l1: ListNode, l2: ListNode) ->ListNode:#直接将对应链表元素进行相加,就正好相当于从个位数开始往上面加

node =ListNode(0)

pointer=node

carry=0while l1 != None or l2 !=None:#那么向后移动到None了后,l2将不会具有val值,这该如何处理?

if l1!=None and l2!=None:if (l1.val + l2.val + carry) >= 10:

node.next= ListNode(l1.val + l2.val + carry - 10)

node=node.next

carry= 1

if (l1.val + l2.val + carry) < 10:

node.next= ListNode(l1.val + l2.val +carry)

node=node.next

carry=0if l1==None:if (l2.val + carry) >= 10:

node.next= ListNode(l2.val + carry - 10)

node=node.next

carry= 1

if (l2.val + carry) < 10:

node.next= ListNode(l2.val +carry)

node=node.next

carry=0if l2==None:if (l1.val + carry) >= 10:

node.next= ListNode(l1.val + carry - 10)

node=node.next

carry= 1

if (l1.val + carry) < 10:

node.next= ListNode(l1.val +carry)

node=node.next

carry=0if l1 !=None:

l1=l1.nextif l2 !=None:

l2=l2.nextif carry == 1:

node.next= ListNode(1)

node=node.nextreturn pointer.next

最后的运行结果如下所示:

1363478-20200906100158793-1018892638.png

发现运行用时比我自己想的办法还大,差一点就超时了,这个官方解答真是奇怪。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KMP算法是一种字符串匹配算法,用于在一个文本串S内查找一个模式串P的出现位置。它的时间复杂度为O(n+m),其中n为文本串的长度,m为模式串的长度。 KMP算法的核心思想是利用已知信息来避免不必要的字符比较。具体来说,它维护一个next数组,其中next[i]表示当第i个字符匹配失败时,下一次匹配应该从模式串的第next[i]个字符开始。 我们可以通过一个简单的例子来理解KMP算法的思想。假设文本串为S="ababababca",模式串为P="abababca",我们想要在S中查找P的出现位置。 首先,我们可以将P的每个前缀和后缀进行比较,得到next数组: | i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | --- | - | - | - | - | - | - | - | - | | P | a | b | a | b | a | b | c | a | | next| 0 | 0 | 1 | 2 | 3 | 4 | 0 | 1 | 接下来,我们从S的第一个字符开始匹配P。当S的第七个字符和P的第七个字符匹配失败时,我们可以利用next[6]=4,将P向右移动4个字符,使得P的第五个字符与S的第七个字符对齐。此时,我们可以发现P的前五个字符和S的前五个字符已经匹配成功了。因此,我们可以继续从S的第六个字符开始匹配P。 当S的第十个字符和P的第八个字符匹配失败时,我们可以利用next[7]=1,将P向右移动一个字符,使得P的第一个字符和S的第十个字符对齐。此时,我们可以发现P的前一个字符和S的第十个字符已经匹配成功了。因此,我们可以继续从S的第十一个字符开始匹配P。 最终,我们可以发现P出现在S的第二个位置。 下面是KMP算法的C++代码实现:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值