Leetcode2 Add Two Numbers

本文详细解析了LeetCode上的经典题目——两数相加,通过链表表示两个非负整数,实现它们的加法并返回结果链表。文章探讨了不同输入情况下的算法处理方式,如链表长度不一等,并提供了详细的实现步骤和代码示例。
摘要由CSDN通过智能技术生成

leetcode2 Add Two Numbers

问题描述

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
example

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.

算法分析

在这里插入图片描述
算法题目看图更能清晰直观了解如何变化,可以很清晰展示如何运算。当然这两个链表是同长度,当然也有其他几种情况。例1,l1.length < l2.length; 例2, l1=[ ], l2=[1,2];例3 l1=[1, 2], l2 = [1]。当我们计算上图两个链表之和的时候,4 + 6 = 10,这种情况下,我们设置current = 0, 同时carry = 1指向下一个。carry的值必须为0或者1,因为最大数的可能值就是9 + 9 + 1 = 19。

实现步骤

  • 将当前节点初始化为返回列表的dummy head
  • 将carry初始化为0
  • 初始化p, q分别为l1和l2的头
  • 循环列表l1以及l2,直到计算全部数据
    1. 设置x为节点p的值,如果p到达l1的结尾,则设置为0
    2. 设置y为节点q的值,如果q到达l2的结尾,则设置为0
    3. 设置sum = x + y + carry
    4. 更新carry = sum/10
    5. 创建一个新的节点,放入的数字是(sum % 10)得到的个位数字,并且设置其为当前节点的下一个,然后将当前节点推进到下一个。
    6. 将p和q提前
  • 检查carry 是否等于1,如果是则将数字1追加到返回list
  • 返回伪头到下一个节点

代码实现

/**
 * 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) {
        ListNode dummyHead = new ListNode(0);
        ListNode p = l1, q = l2, curr = dummyHead;
        int carry = 0;
        while(p != null || q != null){
            int x = (p != null) ? p.val : 0;
            int y = (q != null) ? q.val : 0;
            int sum = carry + x + y;
            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、付费专栏及课程。

余额充值