目录
前言:
JavaScript没有链表,启蒙题,难度中
迭代法
伪代码:
function(l1,l2)
//listnode的两个链表
total=0
next1=0
//初始化,total表示两链表相加的和,next1代表是否向下一位进1
result=ListNode()
//结果是链形式返回,result是结果集
cur=result
//这里相当于第一题中移动的那个指针
while(l1!=null and l2!=null())
total = l1.val+l2.val+next1
//next取个位数
cur.next=ListNode(total%10)
//next1取10位数
next1 =total/10
l1=l1.next
l2=l2.next
cur=cur.next
//是另一种情况还是与此同时另一端呢,上面是l1为空,那下面是l2位空
while l1!=null
total =l1.val+next1
cur.next=listNode(total%10)
next1=total/10
l1=l1.next
cur=cur.next
if next1!=0
//没结束,有个数没加进来
cur.next=ListNode(next1)
//合成了新链表
return result.next
//思考这里为什么返回next而不是result
递归法
伪代码
function(l1,l2)
total=l1.val+l2.val
next1=total/10
res=ListNode(total%10)
//满足3个中的一个继续执行
if(l1.next!=null
or
l2.next!=0
or
next1 !=0)
//看起来要嵌套的样子
if(l1.next!=null l1=l1.next)
else
li=ListNode(0)
if(l2.next!=null)
l2=l2.next
else:
l2=listNode(0)
//用0填充
l1.val=l1.val+next1
res.next=function(l1,l2)
return res
JavaScript解法
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function(l1, l2) {
let dummy =new ListNode();//新建链表,有头部
let curr =dummy;//指针,默认指向头部
let carry =0;//储存进位的
while(l1 !== null || l2!=null){
// 只要两个链表有一个不为空,执行下面相加运算
let sum =0;
// 仍然分情况告诉计算机具体执行步骤
if(l1!=null){
sum+=l1.val;//和
l1=l1.next//本链表的下一个节点存储,防止原地打转,第一个数加起来
}
if(l2!=null){
sum+=l2.val;//和
l2=l2.next//本链表的下一个节点存储,防止原地打转,第一个数加起来
}
// 每次都要处理进位carry
sum +=carry;
curr.next=new ListNode(sum%10);
carry=Math.floor(sum/10);//JavaScript浮点数处理,
curr=curr.next
}
if(carry>0){
curr.next=new ListNode(carry)
}
return dummy.next
//此时链表l1和l2的节点已经发生了变化
};