两数相加

两数相加

点击链接加入群聊【java菜鸟学习】:https://jq.qq.com/?_wv=1027&k=5afU7nS
群号:124569404

第一个版本

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */

/**
 * ClassName: courseTwo
 *
 * @author leegoo
 * @Description: 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
 * 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
 * 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
 * 示例:
 * 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
 * 输出:7 -> 0 -> 8
 * 原因:342 + 465 = 807
 * @date 2019年01月09日
 */
class Solution {
    
    public static void main(String[] args) {
        ListNode l1 = new ListNode(2);
        ListNode son = new ListNode(4);
        ListNode grandson = new ListNode(3);
        l1.next = son;
        son.next = grandson;

        ListNode l2 = new ListNode(5);
        ListNode l2son = new ListNode(6);
        ListNode l2grandson = new ListNode(4);
        l2.next = l2son;
        l2son.next = l2grandson;
    }
    
        public static String bigNumberAdd(String f, String s) {
        System.out.print("加法:" + f + "+" + s + "=");
        // 翻转两个字符串,并转换成数组
        char[] a = new StringBuffer(f).reverse().toString().toCharArray();
        char[] b = new StringBuffer(s).reverse().toString().toCharArray();
        int lenA = a.length;
        int lenB = b.length;
        // 计算两个长字符串中的较长字符串的长度
        int len = lenA > lenB ? lenA : lenB;
        int[] result = new int[len + 1];
        for (int i = 0; i < len + 1; i++) {
            // 如果当前的i超过了其中的一个,就用0代替,和另一个字符数组中的数字相加
            int aint = i < lenA ? (a[i] - '0') : 0;
            int bint = i < lenB ? (b[i] - '0') : 0;
            result[i] = aint + bint;
        }
        // 处理结果集合,如果大于10的就向前一位进位,本身进行除10取余
        for (int i = 0; i < result.length; i++) {
            if (result[i] >= 10) {
                result[i + 1] += result[i] / 10;
                result[i] %= 10;
            }
        }
        StringBuffer sb = new StringBuffer();
        // 该字段用于标识是否有前置0,如果有就不要存储
        boolean flag = true;
        // 注意从后往前
        for (int i = len; i >= 0; i--) {
            if (result[i] == 0 && flag) {
                continue;
            } else {
                flag = false;
            }
            sb.append(result[i]);
        }
        // 结果
        System.out.println(sb.toString());
        return sb.toString();
    }


    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        StringBuffer s1 = new StringBuffer();
        eachListNode(l1, s1);
        StringBuffer s2 = new StringBuffer();
        eachListNode(l2, s2);
        String s3;
        String s1s = s1.toString();
        String s2s = s2.toString();
        if ((s1s.length() + s2s.length()) < 10) {
            s3 = Integer.valueOf(s1s) + Integer.valueOf(s2s) + "";
        } else {
            s3 = bigNumberAdd(s1s, s2s);
        }
        String reverseReuslt = new StringBuilder(s3).reverse().toString();
        int one = reverseReuslt.charAt(0) - '0';
        ListNode r = new ListNode(one);
        if (reverseReuslt.length() > 1) {
            createNode(r, reverseReuslt, 1);
        }
        return r;
    }

    private static void createNode(ListNode r, String reverseReuslt, int idx) {
        try {
            int i = reverseReuslt.charAt(idx) - '0';
            if (-1 != i) {
                ListNode node = new ListNode(i);
                r.next = node;
                idx++;
                createNode(node, reverseReuslt, idx);
            }
        } catch (Exception e) {
            return;
        }
        return;
    }

    public static StringBuffer eachListNode(ListNode node, StringBuffer s) {
        if (node.next != null) {
            eachListNode(node.next, s);
        }
        return s.append(node.val);
    }
}

第二个版本

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode p1 = l1,p2=l2;//用于循环
        int sum = 0; //求和
        ListNode rs = new ListNode(-1);//初始化一个ListNode
        ListNode cur = rs;  //临时保存节点信息
        while (null != p1 && null != p2) {
            sum+=p1.val;  //必须要先加val,
            sum+=p2.val;

            p1 = p1.next; // 新的p1 =  p1.next
            p2 = p2.next;

            cur.next = new ListNode(sum%10); //对10进行取模,如果没超过10会保留原数,比如 7%10 = 7
            sum /= 10; //对10进行整除,小于10会等于0  
            cur = cur.next; //临时的ListNode = 下一个
        }
        return  rs.next; //因为第一个ListNode没有用, 所以用rs.next (如果不用rs.next 会有rs后面会有3个节点,加本身就是4个, 而用rs.next 的话  节点(包括自身)就只有三个了)
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值