[算法基础]链表操作-两数相加

题目

给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

解题思路

由于整数按照逆序方式进行存储,所以两个整数在最低位已经对齐了,我们只需要按照正常的加法运算,用新的链表res,记录原有的链表从左到右逐一相加的结果,如果有结果,则在res上新增一个节点,如果有溢出,即某一位上的和的结果大于9了,我们只在该位上保留个位,使用变量addition将十位进到下一个链表节点上,做进一步的加法操作。如果所有需要计算的节点计算完毕,并没有产生进位,则不需要在res上新增节点了。
所以我们需要实现两个操作:

  • 相加
  • 进位

在输出结果时候,还需要将res反序输出。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
 
 /**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
 var addTwoNumbers = function(l1, l2) {
 	// 设置两个链表 res 为返回值,p 为临时变量,作为中间节点
 	var res = p = {};
 	// 记录是否要进位
 	var addition = 0;
 	// 每次循环的计算和
 	var sum = 0;
 	while(l1||l2){
 		/**
 		* 1. 判断 l1/l2 节点是否是空节点且是否有值,如果不满足前两个条件,则值为0
 		* 2. 判断临时变量的值(进位值是1)是否存在,如果不存在,则值为0
 		* 3. 求和
 		*/ 
 		sum = (l1 && l1.val || 0) + (l2 && l2.val || 0) + {p.val || 0};
 		// 记录是否要进位
 		addition = parsentInt(sum/10);
 		// l1/l2 节点在计算完毕之后,进入下一个节点进行计算。
 		l1 = l1 && l1.next
 		l2 = l2 && l2.next
 		// 临时变量记录当前节点计算后的个位值
 		p.val = sum%10
 		// 如果需要进位,或者两数链表未计算完毕 则新建一个节点
 		if(l1||l2||addtion){
 			p.next = {val:addition}
 		}
 		// 临时变量进入下一个节点
 		p = p.next
 	}
 	return res
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值