Leetcode算法题之2.两数相加

题目如下所示:

链表定义如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public int val;
 *     public ListNode next;
 *     public ListNode(int val=0, ListNode next=null) {
 *         this.val = val;
 *         this.next = next;
 *     }
 * }
 */

看到这道题时很容易想到 对应位数相加再进位,主要是处理几个细节:

1.计算到最大位才终止

2.位数不够的可以看成前面补0

3.由于初始化链的值为0,要计算到那一位时才创建那一位的链,不然输出结果会多出个0,如1+18=019

4.要处理加上进位后大于10的值

5.最后一位加上进位值后大于10时,再加一位,如99+1=100

6.最后答案返回的是首部,需要有一直指向首部的

7.由于是单向链表,在后面修改next继续添加时,需要有指向前面的

结果如下:、

public class Solution {
    public ListNode AddTwoNumbers(ListNode l1, ListNode l2) {
        int addN=0,num;
        ListNode ans=new ListNode();
        ListNode ansN=ans,ansP=ansN; //ans为答案,ansN为当前计算的,ansP为前一个
    while(l1!=null||l2!=null){
        if(ansN==null){   // 如果当前计算的链为空,则创建,并把前一个的next指向当前计算的
        ansN=new ListNode();
        ansP.next=ansN;
        }

        if (l1==null){   //对应位计算,位数不够的看成往前填0,如6+18看成06+18
            num=0+l2.val;
            l2=l2.next;
        }
        else if(l2==null){
            num=0+l1.val;
            l1=l1.next;
        }
        else {
            num=l1.val+l2.val;
            l1=l1.next;
            l2=l2.next;
        }

        ansN.val=num+addN;//注意先加上一位给的进位,再改变给下一位的进位
        if(ansN.val>9){  //大于10则进位1,由于最大为19,看成与10差值即可
            ansN.val=ansN.val-10;
            addN=1;
        }
        else addN=0;

        ansP=ansN;  //ansP与ansN都下一位
        ansN=ansN.next;
    }

    if (addN==1){    //加到最后一位时若任有进位,记得在添加一位
       ansN=new ListNode();
       ansN.val=addN;
       ansP.next=ansN;
    }

    return ans;
    }
    
}

还考虑过迭代,但是给出的函数参数只有两个链表,不好处理进位问题,就没用 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值