zoukankan      html  css  js  c++  java
  • LeetCode题解 #2 Add Two Numbers

    题目大意:使用链表表示的两个整数,计算出其和,以同样的形式返回。

    Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)

    Output: 7 -> 0 -> 8

    觉得做OJ最大的问题是有时看不懂题目。

    其实是这样的,一个链表代表一个非负整数数,是从右往左看的:

    (2 -> 4 -> 3) = 342;

     (5 -> 6 -> 4)=465;

    342+465=7 -> 0 -> 8=807;

    逆序其实是很大很大的便利!!!!

    因为最左边是个位,只要这样一个个加,在考虑进位就好了。而且个位数相加,进位只能是1.

    如果左边是最高位就麻烦了,因为数都是从最低位开始加的,还要遍历到最右边什么的。

    所以思路如下:

    1、一个用来记录进位的变量

    2、如果两个链表都非空,把结点得数取出来,相加,对10取余构造新结点,记录进位。list=list.next

    3、如果任意一个链表空了,就直接以他的结点构造新结点。

    public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

    ListNode temp1 = l1;
    ListNode temp2 = l2;

    int temp =temp1.val+temp2.val;

    //System.out.println("first------->"+temp);

    int jinwei = 0;

    if(temp>=10){

    temp%=10;
    jinwei=1;

    }

    temp1=temp1.next;
    temp2=temp2.next;


    ListNode result = new ListNode(temp);
    ListNode resulttemp = result;

    while(temp1!=null&&temp2!=null){

    //连个链表都有结点,则两节点相加
    temp =temp1.val+temp2.val;

    //如果前面有进位
    if(jinwei==1){

    temp++;
    jinwei--;

    }


    //考虑进位

    if(temp>=10){

    temp%=10;
    jinwei=1;

    }

    resulttemp.next = new ListNode(temp);

    temp1=temp1.next;
    temp2=temp2.next;
    resulttemp=resulttemp.next;

    }
    while(temp1!=null){

    if(jinwei==1){

    int t1 = ++temp1.val;
    jinwei--;

    if(t1>=10){

    t1%=10;
    jinwei++;


    }


    resulttemp.next = new ListNode(t1);



    }
    else{

    resulttemp.next = new ListNode(temp1.val);

    }
    resulttemp=resulttemp.next;
    temp1=temp1.next;




    }
    while(temp2!=null){

    if(jinwei==1){

    int t2 = ++temp2.val;
    jinwei--;

    if(t2>=10){

    t2%=10;
    jinwei++;


    }


    resulttemp.next = new ListNode(t2);



    }
    else{

    resulttemp.next = new ListNode(temp2.val);

    }
    resulttemp=resulttemp.next;
    temp2=temp2.next;




    }
    if(temp1==null&&temp2==null&&jinwei==1)
    resulttemp.next = new ListNode(1);


    return result;

    }
    }

    所以说,大数的构造就应该这样构造,虽然是一道加法题,但是加减乘除都能很好的支持。

    一开始想的是,把数取出来,然后构造一个数,再相加,然后再构造链表就行。但这样是错误的!!!

    因为传入的链表可能很长很长,用long都会溢出的超级大数!

    而且,这个代码是直接在LeetCode上写的,其实也挺方便,毕竟我只用printf来调试。也就是没了代码补全而已,不过不用写main函数也好。

  • 相关阅读:
    一个统计代码行数的简单方法
    关于string的对象引用
    mysql连接的一些问题。
    linux环境初始化 用户问题
    php null o false ''
    php支付宝在线支付接口开发教程【转】
    模拟支付宝服务窗环境
    ctags
    校验全球电话号码 正确性 库 正则表达式
    php短路与 短路或
  • 原文地址:https://www.cnblogs.com/wzben/p/5018064.html
Copyright © 2011-2022 走看看