内容简介:假定目前存在两个整数链表,并且约定每个元素的取值范围都是[0,9]。 每个链表用来表示一个数字的反序,例如[4,2,5]表示524,[9,6,2,4,5]表示54269. 现在要求对跟定的两个数组进行相加运算,并且输出相加之和的链表。例如:既然每个链表表示的是一个数字的逆序,那么可以通过将链表转换成数字,然后再通过数字进行相加,将结果再转回数字的方式进行求解。 也就是下面的过程:
链表相加问题
假定目前存在两个整数链表,并且约定每个元素的取值范围都是[0,9]。 每个链表用来表示一个数字的反序,例如[4,2,5]表示524,[9,6,2,4,5]表示54269. 现在要求对跟定的两个数组进行相加运算,并且输出相加之和的链表。
例如:
l1 = [4,2,5] l2 = [3,8,3] l1+l2=[8,0,8]
解决方案 一 通过数字相加
既然每个链表表示的是一个数字的逆序,那么可以通过将链表转换成数字,然后再通过数字进行相加,将结果再转回数字的方式进行求解。 也就是下面的过程:
ListNode 1 ---> Number + = Number ---------> ListNode ListNode 2 ---> Number
func convertListNodetoInt(l *ListNode) (result int) { level := 0 for { weight := 1 for i := 0; i < level; i++ { weight *= 10 } result += l.Val * weight if l.Next != nil { l = l.Next level++ } else { return result } } } func convertIntToListNode(result int) *ListNode { if result == 0 { return &ListNode{ Val: result, Next: nil, } } level := 1 weight := 1 for (result/weight != 0) { weight *= 10 level++ } //当商是0的时候,才是真正的层级。但上面的逻辑多添加了一层。所以回退一层 level -- weight /= 10 if level == 1 { return &ListNode{ Val: result, Next: nil, } } weight = 10 var ls []*ListNode for i := 1; i <= level; i++ { ls = append(ls, &ListNode{ Val: result % weight, Next: nil, }) // 保留商数 result /= weight } for i := 0; i < len(ls)-1; i++ { ls[i].Next = ls[i+1] } return ls[0] }
这个方案有个最大的弊端,可支持的数字范围是受限的。 即便使用int64,也是有上限的。 但链表理论上是无限扩展的,所以这个方案只能解决int64以下的数据集。
方案二 链表直接相加
第二个方案是模拟人类计算的过程。 例如我们在计算325+456时,是按照下面的过程进行计算的:
3 2 5 + 4 5 6 ------- = 7 8 1
首先按低位向高位的循序进行按位相加,如果结果对10求商大于1,则向前进一位,否则不进位。并将结果对10取模之后的数字作为此位的最终结果。 逐位处理,直到某一位为空时,最后处理进位然后停止。
所以按照这个逻辑,依次对两个链表中的元素进行求和运算,将合数对10求商。如果计算到某个链表为空时,则表明一个数字计算完毕,此时将另外一个链表的元素与进位相加,作为最终结果。
代码如下:
func addTwoNumbers(l1 *ListNode, l2 *ListNode) (*ListNode) { result := &ListNode{} curr := result carry := 0 for (l1 != nil || l2 != nil) { _x := 0 if l1 == nil { _x += l2.Val } else if l2 == nil { _x += l1.Val } else { _x += l1.Val + l2.Val } _x += carry carry = _x / 10 curr.Next = &ListNode{ Val: _x % 10, } curr = curr.Next if l1 != nil { l1 = l1.Next } if l2 != nil { l2 = l2.Next } } if carry > 0 { curr.Next = &ListNode{ Val: carry, Next: nil, } } return result.Next }
以上所述就是小编给大家介绍的《算法 链表相加问题》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 【算法】2. 两数相加
- 算法-两数相加TwoSum
- 蓝桥杯 ADV-18 算法提高 实数相加
- flex actionScript时间处理相加返回相加后的date
- LeetCode:两数相加
- LeetCode——两数相加
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Developer's Guide to Social Programming
Mark D. Hawker / Addison-Wesley Professional / 2010-8-25 / USD 39.99
In The Developer's Guide to Social Programming, Mark Hawker shows developers how to build applications that integrate with the major social networking sites. Unlike competitive books that focus on a s......一起来看看 《Developer's Guide to Social Programming》 这本书的介绍吧!