【LeetCode】【Java】【链表】2. 两数相加【中等】

2. 两数相加

思路:

  1. 遍历l1 l2,总有一个先结束(或同时);
  2. sum记录相同位的和,newval要考虑上进位的+1;个位上的和肯定不用进位;
  3. 新建个sumlist,和它的游标cursor,newval可能大于等于10,记得取余
  4. 第一个循环跳出,l1和l2可能还有一个没遍历完呢,第二个循环继续第一个循环所做的事
  5. 最后可能还需要再进一位,比如99 + 99 = 198 从两位变三位了,还是用flag=1判断是否要进位

下面这个烂代码是根据测试用例出现的问题,一点点打补丁修正的,所以有点烂。 

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode sumlist = new ListNode();
        ListNode cursor = sumlist;
        int sum;
        int flag=0;//进位标记
        int newval;
        while (l1 != null && l2 != null){
            sum = l1.val + l2.val;
            newval = sum + flag;
            cursor.next = new ListNode(newval%10);
            cursor = cursor.next;

            if (newval >= 10){//判断进位
                flag = 1;//进位1
            }else{
                flag = 0;//不进位得置零
            }
            sum = 0;//置零
            newval = 0;
            l1 = l1.next;
            l2 = l2.next;
            
        }
        //l1或者l2还有一个没有读完,同样可能遗留下进位
        if(l1 != null || l2 != null){
            ListNode remain = (l1 != null?l1:l2 );
            while (remain != null){
                newval = remain.val + flag;
                cursor.next = new ListNode(newval%10);
                if (newval >= 10){//判断进位
                flag = 1;//进位1
                }else{
                flag = 0;//不进位也得置零
                }
                newval = 0;
                remain = remain.next;
                cursor = cursor.next;
            }
            
        }
        //最后再进一位,如果两数和的位数 大于 两数的位数
        if(flag ==1){
            cursor.next = new ListNode(flag);
        }
        return sumlist.next;
        
    }
}

明显可以感觉到,第一第二个while可以并在一起啊,并且评论区也确实有这样干的大佬,借鉴了一下,不然真的不会哇

重点是:

  1. while循环多判断一下flag是否仍需进位,是,那么循环继续
  2. 如果一条链表比较长,那么遍历完短的,sum就不需要加短链表的值了,这个用两个if判断解决
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode sumlist = new ListNode();
        ListNode cursor = sumlist;
        int sum = 0;
        int flag=0;
        int newval;
        while (l1 != null || l2 != null || flag != 0){
            if (l1 != null) {
                sum += l1.val;
                l1 = l1.next;
            }
            if (l2 != null) {
                sum += l2.val;
                l2 = l2.next;
            }
            
            newval = (sum+ flag) ;
            flag = newval/10;
            cursor.next = new ListNode(newval%10);
            cursor = cursor.next;
           
            sum = 0;//置零
            newval = 0;
            
        }

        return sumlist.next;
        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值