本文描述的是我自己的一个失败的挑战经历。
题目
两个单链表(singly linked list),每一个节点里面一个0-9的数字, 输入就相当于两个大数了。然后返回这两个数的和(一个新list)。这两个输入的list 长度相等。 要求是:1. 不用递归。2. 要求算法在最好的情况下,只遍历两个list一次, 最差的情况下两遍。
我的算法是: 2次遍历是肯定能的,第一次相加并以倒序存,第二次进位并倒序。一次/两次的算法,用2个指针,一个指钱一个,另一个指向再前一个,另一个flag标志是否走第二轮。只有前前位有进位flag置true跑第二次。
为啥当时会有这样的想法呢?因为所有数字都是0~9,所以我假设了第一轮的相加和进位能把大部分该进位的都进了,所以如果存在需要第二轮的话,找出那个条件就好了。当时就沿着这个思路走了。当然大部分情况下这个算法是可行的,但是这里有个很明显的漏洞,当时被胜利冲昏头脑的我怎么会想的到呢?就是一开始没有出现进位,后来连续进位的情况,如
@赵小罡这位朋友设计的用例 1000001+9999999。一并感谢其他指出错误的网友。
如果有人想怀着鄙视的心态看下我错误的代码,请点击“
源码",不过放在心里就好了,不要打击我脆弱的心灵哦。:)
另外有个高手做了一个算法,总是只要一次就能搞定的。@hawstein详情见“
求两个单链表的和” 尼害的不得了。他的网站上还有不少好东西呢。对于他的算法,我有个改进的建议就是,以他的算法完全没有必要单独考虑第一个节点的情况,在遍历结束后,判断下第一个节点是否大于9就OK了,如果大于9,最前面插入一个节点。