leetcode-n2-两数相加

leetcode-两数相加

下面的类,可以重用,修改一下可以运行在在线IDE,给出了测试main()

题目源地址

提交记录

/*
 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

 示例:

 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
 输出:7 -> 0 -> 8
 原因:342 + 465 = 807

 来源:力扣(LeetCode)
 链接:https://leetcode-cn.com/problems/add-two-numbers
 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */

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

class ListNode {
    int val;

    ListNode next;

    ListNode(int x) {
        val = x;
    }
}

class Solution {

    public static void main(String[] args) {
        Solution solution = new Solution();

        //基本测试
        ListNode res = solution.addTwoNumbers(solution.long2ListNode(342), solution.long2ListNode(465));
        sout(res);

        //特殊:单链表
        res = solution.addTwoNumbers(solution.long2ListNode(619), solution.long2ListNode(0));
        sout(res);
        //特殊:边界进位
        res = solution.addTwoNumbers(solution.long2ListNode(5), solution.long2ListNode(5));
        sout(res);

        res = solution.addTwoNumbers(solution.long2ListNode(1), solution.long2ListNode(99));
        sout(res);
    }

    private static void sout(ListNode l3) {
        while (l3 != null) {
            System.out.println(l3.val);
            l3 = l3.next;
        }
        System.out.println("---------");
    }

    /**
     * 说明: 使用进位
     * @author suwenguang
     * @date 2019/6/10
     * @return n2.ListNode <- 返回类型
     */
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //参数校验
        if (l1 == null || l2 == null) {
            return null;
        }
        if (l1.val < 0 || l2.val < 0) {
            return null;
        }
        //主逻辑
        //进位链表
        ListNode carrier = new ListNode(0);
        //结果链表
        ListNode res = new ListNode(0);
        //临时链表
        ListNode temp = res;

        while (l1 != null && l2 != null) {
            //相加进位
            int val = l1.val + l2.val + carrier.val;
            if (val >= 10) {
                carrier.next = new ListNode(1);
            } else {
                carrier.next = new ListNode(0);
            }
            //赋值res
            int remain = val % 10;
            temp.next = new ListNode(remain);

            //指针移动
            temp = temp.next;
            l1 = l1.next;
            l2 = l2.next;
            carrier = carrier.next;
        }
        while (l1 != null) {
            int val = carrier.val + l1.val;
            if (val >= 10) {
                carrier.next = new ListNode(1);
            } else {
                carrier.next = new ListNode(0);
            }

            //赋值
            int remain = val % 10;
            temp.next = new ListNode(remain);

            //指针移动
            l1 = l1.next;
            carrier = carrier.next;
            temp = temp.next;

        }
        while (l2 != null) {
            int val = carrier.val + l2.val;
            if (val >= 10) {
                carrier.next = new ListNode(1);
            } else {
                carrier.next = new ListNode(0);
            }

            //赋值
            int remain = val % 10;
            temp.next = new ListNode(remain);

            //指针移动
            l2 = l2.next;
            carrier = carrier.next;
            temp = temp.next;

        }

        //判定是否还有进位
        if (carrier.val == 1) {
            temp.next = new ListNode(1);
        }

        return res.next;
    }

    /**
     * 说明:暴力解法
     * @author suwenguang
     * @date 2019/6/10
     * @return n2.ListNode <- 返回类型
     */
    @Deprecated
    public ListNode addTwoNumbersFail(ListNode l1, ListNode l2) {
        //参数校验
        if (l1 == null || l2 == null) {
            return null;
        }
        if (l1.val < 0 || l2.val < 0) {
            return null;
        }
        //将链表转为整数
        long a = listNode2Long(l1);
        long b = listNode2Long(l2);

        //相加
        long res = a + b;

        //结果转链表返回
        ListNode head = long2ListNode(res);

        return head.next;
    }

    /**
     * 说明:  ListNode 转 long
     * @author suwenguang
     * @date 2019/6/10
     * @return long <- 返回类型
     */
    private long listNode2Long(ListNode l2) {
        int i = 1;
        long res = 0;
        ListNode tempNode;
        tempNode = l2;
        while (tempNode != null) {
            res = res + (tempNode.val * i);
            tempNode = tempNode.next;
            i *= 10;
        }
        return res;
    }

    /**
     * 说明: long 转 ListNode
     * @author suwenguang
     * @date 2019/6/10
     * @return n2.ListNode <- 返回类型
     */
    private ListNode long2ListNode(long res) {
        ListNode tempNode;
        long temp = 11;

        ListNode head = new ListNode(-1);
        tempNode = head;

        while (res / 10 > 0) {
            temp = res % 10;
            ListNode next = new ListNode((int) temp);
            tempNode.next = next;
            tempNode = next;
            res /= 10;
        }
        ListNode end = new ListNode((int) res);
        tempNode.next = end;
        return head.next;
    }
}

2019-06-10 19:37:14 星期一

转载于:https://my.oschina.net/suveng/blog/3060387

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值