首页 > 其他 > 详细

LeetCode0002 两数相加

时间:2021-08-15 23:04:51      阅读:18      评论:0      收藏:0      [点我收藏+]

技术分享图片

1 问题描述

给定两个链表,每个链表表示一个非负整数,其各位数字逆序存储在链表的每个节点中。将这两个整数相加,并以相同形式返回一个表示和的链表。

2 错误解法

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 将l1中数字转换成一个整数
        int n1 = 0, m = 1;
        while(l1 != null){
            n1 += l1.val * m;
            l1 = l1.next;
            m *= 10;
        }

        // 将l2中数字转换成一个整数
        int n2 = 0;
        m = 1;
        while(l2 != null){
            n2 += l2.val * m;
            l2 = l2.next;
            m *= 10;
        }

        // 两数相加
        int sum = n1 + n2;
        
        // 将结果按要求转换成链表
        ListNode head = null, tail = null;
        while(sum != 0){
            if(head == null){
                head = tail = new ListNode();
                tail.val = sum % 10;
                sum /= 10;
            }else{
                tail.next = new ListNode();
                tail = tail.next;
                tail.val = sum % 10;
                sum /= 10;
            }
        }
        if (tail == null) {  // 考虑 0 + 0 == 0 的特殊情况
            tail = new ListNode();
            tail.val = 0;
            tail.next = null;
            head = tail;
        }else {
            tail.next = null;
        }

        return head;
    }
}

错误原因:使用整型变量记录链表所表示的非负整数的值,将两个整数相加,得到的结果再按题目要求转换成链表形式。这种思路虽然很笨,但对于1568个测试用例中的792个都是可行的,但随着测试用例中整数的位数增多,整数变量会超出范围,导致出现错误结果。尝试使用java.math.BigInteger类,但好像也不可行。

技术分享图片

 技术分享图片

3 正确解法

技术分享图片

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int sum = 0, carry = 0;
        int m = 0, n = 0;
        ListNode head = null, tail = null;
        while(l1!= null || l2 != null){
            m = l1 == null ? 0 : l1.val;
            n = l2 == null ? 0 : l2.val;
            sum = m + n + carry;

            if (head == null) {
                head = tail = new ListNode(sum % 10);
            }else {
                tail.next = new ListNode(sum % 10);
                tail = tail.next;
            }
            carry = sum / 10;

            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        if (carry > 0) {
            tail.next = new ListNode(carry);
            tail = tail.next;
            tail.next = null;
        }

        return head;
    }
}

技术分享图片

技术分享图片

技术分享图片

LeetCode0002 两数相加

原文:https://www.cnblogs.com/wangmengdx/p/15144600.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!