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,求两个链表之和,返回和的链表形式
第一次尝试
个人觉得这道题本身并不难,只要小学的时候学过竖式加法的都知道原理,就算忘了,看看下面的图就会想起来了
- 位数对其,各位对各位,十位对十位……
- 个位数的进位为0,从个位开始,然后十位,百位…….
- 将对应位数、进位相加,所得结果sum
- sum%10为结果数字对应位数的值
- sum/10为进位
- 重复上面三步直到两个加数遍历完成,且没有进位
数据结构也不复杂,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
- 2.Add Two Numbers
- 2.Add Two Numbers
- 2.Add Two Numbers
- 2.Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 2.Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 2.Add Two Numbers
- 2. Add Two Numbers
- 2. Add Two Numbers
- 动态规划-美团笔试题-拜访
- Java工具类TextUtil(可以进行字符串处理的)
- 个人信息调查
- CURL 笔记
- 2014年山东省第五届ACM--angry_birds_again_and_again
- 2.Add Two Numbers
- 如何使用js懒加载图片|如何使用jquery.lazyload.js|网页优化|如何提高网页加载速度
- 飛飛(二十三)时间类
- WIN8安装SQL SERVER2008:出现创建userSettings/Microsoft.SqlServer.Configuration
- 剑指offer系列之4:重建二叉树
- Java实现数组反转翻转的方法
- Android系统框架和开机流程
- 【HDU 5640】【水题】King's Cake
- 【图】拓扑排序