coding everyday

编程面试题 https://interview.codeplex.com

C++博客 首页 新随笔 联系 聚合 管理
  12 Posts :: 2 Stories :: 7 Comments :: 0 Trackbacks
本文描述的是我自己的一个失败的挑战经历。

题目
两个单链表(singly linked list),每一个节点里面一个0-9的数字, 输入就相当于两个大数了。然后返回这两个数的和(一个新list)。这两个输入的list 长度相等。 要求是:1. 不用递归。2. 要求算法在最好的情况下,只遍历两个list一次, 最差的情况下两遍。

我的算法是: 2次遍历是肯定能的,第一次相加并以倒序存,第二次进位并倒序。一次/两次的算法,用2个指针,一个指钱一个,另一个指向再前一个,另一个flag标志是否走第二轮。只有前前位有进位flag置true跑第二次。

为啥当时会有这样的想法呢?因为所有数字都是0~9,所以我假设了第一轮的相加和进位能把大部分该进位的都进了,所以如果存在需要第二轮的话,找出那个条件就好了。当时就沿着这个思路走了。当然大部分情况下这个算法是可行的,但是这里有个很明显的漏洞,当时被胜利冲昏头脑的我怎么会想的到呢?就是一开始没有出现进位,后来连续进位的情况,如@赵小罡这位朋友设计的用例 1000001+9999999。一并感谢其他指出错误的网友。

如果有人想怀着鄙视的心态看下我错误的代码,请点击“源码",不过放在心里就好了,不要打击我脆弱的心灵哦。:)

另外有个高手做了一个算法,总是只要一次就能搞定的。@hawstein详情见“求两个单链表的和” 尼害的不得了。他的网站上还有不少好东西呢。对于他的算法,我有个改进的建议就是,以他的算法完全没有必要单独考虑第一个节点的情况,在遍历结束后,判断下第一个节点是否大于9就OK了,如果大于9,最前面插入一个节点。
posted on 2013-07-02 09:51 everyday 阅读(403) 评论(0)  编辑 收藏 引用 所属分类: Algorithm

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理