Python链表之两数之和

  • 2019 年 10 月 5 日
  • 笔记

两数之和


今日知图标记 某一块代码可能需要稍后处理 使用m增加一个标记,标记名称可以是a~z和A~Z之间的任意一个字母; 添加标记了的行如果被删除,标记同时被删除; 后面的标记名与前面一致会覆盖前面相同的标记;

mx mark 添加标记x,x可以是a~z和A~Z之间的任意一个字母  'x 直接定位到标记x所在位置  

0.说在前面1.两数之和2.思路分析3.实现方法4.算法分析5.作者的话


0.说在前面

又到了新的一周,我们这周的第一篇LeetCode,有关链表话题,在python中如何操作链表,定义链表呢?有关这个问题,大家可以留言,将情况反馈,我根据情况发文,本来惯例周二发文,实际上是每周一刷题,但是由于时间安排问题放在了周二,所以以后还是惯例周二,但是本周二被安排了,所以提前发文LeetCode!

下面一起来看本次刷题,两数之和!!!

1.两数之和

问题

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 单位 数字。

如果,我们将这两个数起来相加起来,则会返回出一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)  输出:7 -> 0 -> 8  原因:342 + 465 = 807  

2.思路分析

方法一

将l1链表的数取出,组成一个数,l2同理,最终求和,将求和结果循环得出每个节点的值,然后链表连接即可!!!

方法二

边循环max(len(l1),len(l1)),边求和,边插入新链表数!!!

3.实现方法

方法一

def addTwoNumbers(self, l1, l2):          sum_l1 = 0          muti = 1          while l1:              sum_l1 += l1.val*muti              l1=l1.next              muti*=10          sum_l2 = 0          muti = 1          while l2:              sum_l2 += l2.val*muti              l2=l2.next              muti*=10          sum_res = sum_l1+sum_l2          print(sum_res)          l = ListNode(0)          p = l          if not sum_res:              return [0]          while sum_res!=0:              r = sum_res%10              sum_res = sum_res//10              p.next = ListNode(r)              p = p.next          p.next = None          p=l.next          del l          return p  

方法二

def addTwoNumbers(self, l1, l2):      if not l1:          return l2      if not l2:          return l1        up = 0      head = ListNode(0)      p = head      while l1 or l2:          curr_sum = 0          if l1:              curr_sum+=l1.val              l1=l1.next          if l2:              curr_sum+=l2.val              l2=l2.next          curr_val = (curr_sum+up)%10          up = (curr_sum+up)//10          p.next = ListNode(curr_val)          p=p.next      if up:          p.next = ListNode(1)          p=p.next      p.next = None      p = head.next      del head      return p  

4.算法分析

方法

时间复杂度

空间复杂度

算法一

O(n)

O(n)

算法二

O(n)

O(n)

对比发现两者时间复杂度与空间复杂度一致,那为什么还会有这么大的提交结果差异?

原因在于,第一个算法有三个循环,虽然都是O(n),但是耗时三倍!!!