LeetCode02-两数相加

题目描述

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

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

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

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

代码
  • 方法一(失败)

    也是很多人可以想到的方法,首先求出两个链表所表示的数,然后进行求和,再将结果转化为链表,返回链表。
    但是忽略了链表可以无限长但是int类型只能到表示2^31-1,有一定的局限性,所以执行不会通过

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            int i = 0, j = 0;
            int num1 = 0, num2 = 0, sum = 0;
            ListNode result = new ListNode(0);
            ListNode temp = result;
            
            // 获取第一个数
            while(true) {
                num1 += l1.val * Math.pow(10, i);
                if(l1.next == null) {
                    break;
                }
                l1 = l1.next;
                i++;
            }
            // 获取第二个数
            while(true) {
                num2 += l2.val * Math.pow(10, j);            
                if(l2.next == null) {
                    break;
                }
                l2 = l2.next;
                j++;
            }
            
            // 求和
            sum = num1 + num2;     
            if(sum == 0) {
                return result;
            } else {
                while(sum != 0){
                    temp.next = new ListNode(sum % 10);
                    temp = temp.next;
                    sum = sum / 10;
                }
                return result.next;
            } 
        }
    }
    
    // 运行结果
    执行结果:
    解答错误
    显示详情
    输入:
    [9]
    [1,9,9,9,9,9,9,9,9,9]
    输出
    [0,-4,-6,-3,-8,-4,-7,-4,-1,-2]
    预期结果
    [0,0,0,0,0,0,0,0,0,0,1]
    
  • 方法二

    第二种方法也是既第一种方法后,又想到的一种方法,简单高效;
    通过两个链表从左至右对应位依次相加,满十进一,模拟加法运算

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            ListNode dummyHead= new ListNode(0);
            ListNode p = l1, q = l2, curr = dummyHead;
            int carry = 0;
            while(p != null || q != null){
                int num1 = (p != null) ? p.val : 0;
                int num2 = (q != null) ? q.val : 0;
                int sum = num1 + num2 + carry;
                carry = sum / 10;  
                curr.next = new ListNode(sum % 10);
                curr = curr.next;
                if(p != null) p = p.next;            
                if(q != null) q = q.next;
            }
            if(carry > 0) {
                curr.next = new ListNode(carry);
            }                
           return dummyHead.next; 
        }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值