?2.两数相加
用链表
将两个链表看成是相同长度的进行遍历,如果一个链表较短则在前面补?00
- 每一位计算的同时需要考虑上一位的进位问题,而当前位计算结束后同样需要更新进位值
- 如果两个链表全部遍历完毕后,进位值为?11,则在新链表最前方添加节点?11
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
let prev=new ListNode(0);//定义一个新联表伪指针,用来指向头指针,返回结果
let cur=prev;//定义一个可移动的指针,用来指向存储两个数之和的位置
let carry=0;//定义一个进位数的指针,用来存储当两数之和大于10的时候,
while(l1!=null || l2!=null){ //当l1 不等于null或l2 不等于空时,就进入循环
const n1=l1?l1.val:0;//如果l1 不等于null时,就取他的值,等于null时,就赋值0,保持两个链表具有相同的位数
const n2=l2?l2.val:0;
var sum=n1+n2+carry; //将两个链表的值,进行相加,并加上进位数
carry=Math.floor(sum/10);//计算进位数 注意可能会有小数
sum=sum%10; //计算两个数的和,此时排除超过10的请况(大于10,取余数)
cur.next=new ListNode(sum);//将求和数赋值给新链表的节点,
//注意这个时候不能直接将sum赋值给cur.next = sum。这时候会报,类型不匹配。
//所以这个时候要创一个新的节点,将值赋予节点
cur=cur.next;//将新链表的节点后移
if(l1!=null){//当链表l1不等于null的时候,将l1 的节点后移
l1=l1.next;
}
if(l2!=null){
l2=l2.next;
}
}
if(carry==1){ //如果最后两个数,相加的时候有进位数的时候,就将进位数,赋予链表的新节点。
//两数相加最多小于20,所以的的值最大只能时1
cur.next=new ListNode(carry);
}
return prev.next; //返回链表的头节点
};
|