leetcod两数相加问题

题目要求

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

题目分析,要求数字相加求和
思路一:第一印象便是将每个链表所表示的数字提取出来,求和后在重新存储在链表中,但在这一过程中,会在链表与数字的转化过程中产生大量的开销,所以放弃这种思路

思路二:题目所给的链表是逆序排列,并且要返回一个逆序存储链表。这与人们计算加法时的思路是一样的,逆序相加。将此思路画图得:
图像思路

考虑情况:
每次循环都要考虑进位
对表尾为null的处理

代码实现:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //进位
        int upNum = 0;
        ListNode resultList = new ListNode(0);
        //创建指向表头的指针
        ListNode result = resultList;

        //循环边界:两加数的最高位计算完毕,且没有进位
        while(l1!=null||l2!=null||upNum!=0){
            int num;
            if(l1 == null&& l2 == null){//两加数高位计算完毕,有进位
                num = upNum;
            }else if(l1 == null){//加数1最高位计算完毕
                num = l2.val+upNum;
                l2 = l2.next;
            }else if(l2 == null){//加数2最高位计算完毕
                num = l1.val+upNum;
                l1 = l1.next;
            }else{
                num = l1.val+l2.val+upNum;
                l1 = l1.next;
                l2 = l2.next;
            }
            upNum = num/10;
            resultList.val = num%10;
            //进位条件,加数仍未到最高位或进位不为零
            if(l1 != null|| l2 != null||upNum!=0){
                resultList.next = new ListNode(0);
                resultList = resultList.next;
            }
        }
        return result;
    }
}

算法思路不变,对代码优化:

利用 三元运算符,减少大量的 if-else 语句,使代码简介明了

package com.hby.exercise01;/*
 * 作用:leetCokde 2.两数相加
 *
 *@author hby_gd@163.com
 *@date 18/7/2020 下午3:02
 */


public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int upNum = 0;
        ListNode resultList = new ListNode(0);
        ListNode result = resultList;
        while(l1!=null||l2!=null){
            int num;
            int x;
            int y;
            x= (l1 == null?0:l1.val);
            y= (l2 == null?0:l2.val);
            num = x+y+upNum;

            if(l1!=null){
                l1= l1.next;
            }
            if(l2!=null){
                l2= l2.next;
            }
            upNum = num/10;
            resultList.next = new ListNode(num%10);
            resultList = resultList.next;

        }
        //考虑循环结束,仍有进位未处理的情况
        if(upNum!=0){
            resultList.next = new ListNode(upNum);
        }

        return result.next;
    }
}

总结:题目难度一般,重点考察了对加法的理解,以及链表的相关操作

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值