美文网首页
Add2Nums 问题

Add2Nums 问题

作者: MikeShine | 来源:发表于2019-05-16 10:15 被阅读0次

两个用单向链表表示的数字加和的问题

题目给出了单向链表的数据结构。然后给出了问题描述:

Add2nums
注意这里的高低位,是从低位到高位的,所以这里的处理方法是按位加和,处理进位即可。

思路

思路正如上面所说,按位加和,处理进位。

分析

思路简单,但是个人在写代码的时候遇到了几个小问题。

  • 加和位数和链表下一个的顺序
    即先建立下一个Node,还是先加和。第一次写代码的时候遇到这样的问题:处理完每一位之后,新建一个Node,到最后,多出来一个空的Node。
    所以这里需要采用,先建立一个 Node,把加和结果写到下一个 Node,进位是上一个 Node 来的进位,这样的计算方式。
  • 返回值
    对于链表类问题,返回值必须返回到链表的头。

代码

package day_48;

//  注意链表代表的高低位  1->2->3 : 321
//   所以这里按位来做,处理一下进位就行了

public class Add2Num_2 {
    public ListNode add(ListNode l1,ListNode l2){
        ListNode res = new ListNode(0);
        ListNode copy = res;
        // 上一次来的进位
        int over = 0;
        while (l1!=null || l2!=null){ // 只要有就往后lu
            int a = (l1==null)?0:l1.val;
            int b = (l2==null)?0:l2.val;
            int sum = a+b+over;
            over = sum/10;
            res.next = new ListNode(sum%10);
            res = res.next;
            if(l1!=null) l1 = l1.next;
            if(l2!=null) l2 = l2.next;
            }
        if(over>0) // 考虑最后一次计算是否有进位
            res.next = new ListNode(over);

        // 注意这里最终是要return到链表最开始的地方 所有的链表结构都是这么处理的
        return copy.next;
    }

    public static void main(String args[]){
        Add2Num_2 x = new Add2Num_2();
        ListNode l1 = new ListNode(2);
        l1.next = new ListNode(4);

        ListNode l2 = new ListNode(0);


        System.out.println(x.add(l1,l2));
    }
}

Follow up

这里题目给出了一个 Follow up 问题,说链表不是从低到高位,反过来怎么办。
这样的话肯定就不能按位处理了。
其实第一次我就把题目看错了,看成这种情况了。用了笨办法,先把链表转成 List<>,再转回去。

package day_48;

// 由于看错了链表对应的高低位,所以第一次理解的时候觉得不能用每一位相加进位法
// 这里用了链表转成整数,相加,再转成链表的做法,稍显复杂

import java.util.ArrayList;
import java.util.List;

public class Add2Nums {
    public ListNode add(ListNode l1,ListNode l2){
        ListNode res = new ListNode(0);
        int c = getNum(l1)+getNum(l2);
        int tmp = c;
        int count = 1;
        while (c>=10){
            count *= 10;
            c /= 10;
        }
        while (count>=1){
            int now_digit = tmp/count;
            res.val = now_digit;
            if(count>=10) { // 防止多建一个链表,不然后面总有一个空的链表
                res.next = new ListNode(0);
                res = res.next;
                }
            tmp %= count;
            count /= 10;
        }
        return res;
    }
    public int getNum(ListNode l){  // 把链表转成整数
        int count = 1;
        ListNode tmp = l;
        List<Integer> ref = new ArrayList<Integer>();
        while (tmp.next!=null){
            ref.add(tmp.val);
            count++;
            tmp = tmp.next;
        }
        ref.add(tmp.val); // 把最后一个也加上
        int a = 0;
        for(int i=0;i<ref.size();i++){
            a += ref.get(i)*Math.pow(10.0,count-1);
            count--;
        }
        return a;
    }

    public static void main(String args[]){
        Add2Nums x = new Add2Nums();
        ListNode l1 = new ListNode(2);
        l1.next = new ListNode(4);
        l1.next.next = new ListNode(3);
        ListNode l2 = new ListNode(2);
        l2.next = new ListNode(4);
        l2.next.next = new ListNode(3);
        System.out.println(x.add(l1,l2));
    }
}

相关文章

  • Add2Nums 问题

    两个用单向链表表示的数字加和的问题 题目给出了单向链表的数据结构。然后给出了问题描述: 思路 思路正如上面所说,按...

  • 问题,不是问题;问题,还是问题

    问题,不是问题 今天,是到新校舍的第一天。没水没电没床铺,教室里连黑板都没有。面对诸多问题,幸运的是...

  • 问题问题还是问题?

    问题实在是太多了!菜要这样做,不这样做是问题;饭没煮好,也是问题;自己不知道学会搞吃的也是问题;生活好像只剩下无尽...

  • 问题不是问题,如何对待问题才是问题。

    这几天身体状态一直不太好,反复头疼,但仍然坚持上课,我知道我要什么。我渴望找到那个自由绽放的自己。 早上怀着期待的...

  • “问题”不是问题,认为“是问题”才是问题

    大概从一个多星期前,腹部就开始有间断的疼痛感了,有时甚至会很难受。这种感觉在今天上午坐车时达到了最强烈,我简直不知...

  • 问题不是问题,怎样看问题才是问题。

    焦点幸福教师 坚持分享第1349天2020.11.17周二 小风波 1.购物 最近布置班级文化,我从网上购...

  • 问题的问题

    “你别总给我说问题、问题,给我提一些建设性的建议行不?” “你咋变成了意见篓子?” 满腔热血地跑到领导面前表功,结...

  • 问题的问题

    “你别总给我说问题、问题,给我提些建设性的建议行不?” “你咋变成了意见篓子?” 满腔热血地跑到领导面前表功,结果...

  • 问题不是问题!?

    创45:3-5 约瑟对他弟兄们说:“我是约瑟,我的父亲还在吗?”他弟兄不能回答,因为在他面前都惊惶。约瑟又对他弟兄...

  • 问题的问题

    问题家庭的问题是:家长本身用着有问题的方法教育孩子,没问题的孩子也变得有问题。 而且更严重的问题是:家长并没有意识...

网友评论

      本文标题:Add2Nums 问题

      本文链接:https://www.haomeiwen.com/subject/qusbaqtx.html