leetcode 2.两数相加

110 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

题目描述

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

例如:l1 = [2,3,4], l2 = [1,2,3] 输出: [3,5,7] 解释: 234 + 123 = 753

解法思路

我们只需要对两个链表的数字进行相加用另一个链表去表示出来

1.暴力破解直接相加法

直接将链表转为数字,然后进行相加得到结果分割后置入另一个链表

该方法容易出现数据类型长度不够存在局限性

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 计算总值
        long sum = toNumber(l1) + toNumber(l2);

        // 将值转化为链表
        String[] split = new StringBuilder(Long.toString(sum)).reverse().toString().split("");
        ListNode head, tail;
        head = tail = new ListNode(Integer.parseInt(split[0]));
        for (int i = 1; i < split.length; i++) {
            tail.next = new ListNode(Integer.parseInt(split[i]), null);
            tail = tail.next;
        }
        return head;
    }

    /**
     * 将链表转化为数值
     * @param listNode 链表
     * @return 链表表示的数值
     */
    public Long toNumber(ListNode listNode) {
        StringBuilder builder = new StringBuilder();
        do {
            builder.append(listNode.val);
            listNode = listNode.next;
        } while (listNode != null);
        return Long.valueOf(builder.reverse().toString());
    }
}

2.按照位数相加法

从个位开始依次相加(也就是链表的头部),>= 10则进一位

结果进行加入链表,如果 >=10 需要减去10 在进行加入 在下一次计算加上这进位的1

如果存在长度不一致则向后补 0 如 12 + 234 = 012 + 234 结果不会发任何变化

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = null, tail = null;
        int value, carry = 0;
        do {
            // 为null进行补零
            int val1 = l1 == null ? 0 : l1.val;
            int val2 = l2 == null ? 0 : l2.val;
            value = val1 + val2 + carry;

            // 判断是否进位
            if (value >= 10) {
                carry = 1;
                value = value - 10;
            } else carry = 0;

            // 置入链表尾部
            if (head == null) {
                head = tail = new ListNode(value);
            } else {
                tail.next = new ListNode(value);
                tail = tail.next;
            }

            // 准备进行下一次循环
            if (l1 != null) l1 = l1.next;
            if (l2 != null) l2 = l2.next;
        } while (l1 != null || l2 != null);

        // 最后一次如果还出现进位则在链表尾部补1
        if (carry != 0) tail.next = new ListNode(1);
        return head;
    }
}

每一个解决方案的衍生都是一个思考的过程,我们不应该去一味的的追求解题刷题的速度,而是提高自己思维,探求未知。

如有不当之处望指出

闻道有先后,术业有专攻,如是而已 -- 《师说》