Add2Nums 问题


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

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

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));
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容