zoukankan      html  css  js  c++  java
  • LeetCode0002 两数相加

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

  • 相关阅读:
    html5+css3中的background: -moz-linear-gradient 用法 (转载)
    CentOS 安装Apache服务
    Linux 笔记
    CURL 笔记
    Spring Application Context文件没有提示功能解决方法
    LeetCode 389. Find the Difference
    LeetCode 104. Maximum Depth of Binary Tree
    LeetCode 520. Detect Capital
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 136. Single Number
  • 原文地址:https://www.cnblogs.com/wangmengdx/p/15144600.html
Copyright © 2011-2022 走看看