2.Add Two Numbers

来源:互联网 发布:deepin linux u盘安装 编辑:程序博客网 时间:2024/05/22 00:24

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

给定两个链表表示两个非负数,每个节点只有单个的数字,节点间按反序存储,例如:(2 -> 4 -> 3) + (5 -> 6 -> 4)表示342+465,求两个链表之和,返回和的链表形式

第一次尝试

个人觉得这道题本身并不难,只要小学的时候学过竖式加法的都知道原理,就算忘了,看看下面的图就会想起来了
这里写图片描述

  1. 位数对其,各位对各位,十位对十位……
  2. 个位数的进位为0,从个位开始,然后十位,百位…….
    1. 将对应位数、进位相加,所得结果sum
    2. sum%10为结果数字对应位数的值
    3. sum/10为进位
    4. 重复上面三步直到两个加数遍历完成,且没有进位

数据结构也不复杂,Python的实现如下:

class ListNode(object):    def __init__(self, x):      self.val = x      self.next = None

一个节点有两个属性,val表示该节点的数值,next表示其后一个节点,链表的最后一个节点为None
搞清楚了上面的算法和数据结构,那我们就开始吧,下面是我写的:

class Solution(object):    def addTwoNumbers(self, l1, l2):        """        :type l1: ListNode        :type l2: ListNode        :rtype: ListNode        """        node1 = l1        node2 = l2        ret = node1.__class__(0)        node = ret        carry = 0        while node1 or node2 or carry:            x, y = getattr(node1, 'val', 0), getattr(node2, 'val', 0)            val = (x + y)%10            node.val = (carry + val)%10            carry = (x + y + carry)/10            node1 = getattr(node1, 'next', None)            node2 = getattr(node2, 'next', None)            if node1 or node2 or carry:                node.next = node.__class__(0)                node = node.next        return ret

总是感觉怪怪的,例如:

  • node1 or node2 or carry出现了两次
  • 计算node.val时,先将对应位数相加得到val,然后将(val+carry)%10作为node的val
  • 在计算进位时,又重新写了一次

提交结果见下图(耗时160ms,共1556个用例):
这里写图片描述

别人家孩子的做法

这里写图片描述
算法是并没有太大的区别,但别人家孩子条理清晰,不做一点点冗余的工作,看完别人家孩子的算法描述,我试着重写了一下:

class Solution(object):    def addTwoNumbers(self, l1, l2):        """        :type l1: ListNode        :type l2: ListNode        :rtype: ListNode        """        node1 = l1        node2 = l2        ret = node1.__class__(0)        node = ret        carry = 0        while node1 or node2:            x, y = getattr(node1, 'val', 0), getattr(node2, 'val', 0)            sum = x + y + carry            carry = sum/10            node1 = getattr(node1, 'next', None)            node2 = getattr(node2, 'next', None)            node.next = node.__class__(sum%10)            node = node.next        if carry:            node.next = node.__class__(carry)        return ret.next

相比之下,比我的是简介明了了一些,提交结果如下图(148ms):
这里写图片描述
总结:别人家孩子思路清晰,没有冗余

0 0