LeetCode- 2 - 两数相加(链表) - Java

本文介绍了一种解决两个链表相加问题的算法实现,通过创建节点变量和使用进位变量来处理相加过程中可能出现的进位情况,并提供了一个完整的Java程序示例。

前言:

如果有对链表不熟悉的,可以参考 顺序表 和 链表 - 单向链表部分

题目要求

在这里插入图片描述
这个题目的 逆序 是废物条件,不用关注, 因为,它要求 最终 结果也是以相同结果来存储的。 其实你逆序了,最后还有再逆序回来,就跟没逆序一样。事实上也没错。所以我们直接将两个链表相对应位置的val相加就行了。


代码 实现步骤

1,创建一个 节点变量 head 和 tail(尾巴),head 用来表示头节点位置,tail 用来表示尾结点位置。

在这里插入图片描述

新的链表,肯定是 null的!因为还不知 l1 和 l2 的 val 值。万一他们为null,那我 new 一个 节点对象干什么?浪费资源。


2.既然相加,就会存在进位,逢十进一。定义一个了 整形变量 carry 用来记录 十位数字

在这里插入图片描述


相加

在这里插入图片描述


创造节点存数据

在这里插入图片描述


判断 是否 产生了 carry 进制数

在这里插入图片描述


遍历

在这里插入图片描述


将最终结果 返回

注意一个小细节:想想看如果两个链表 在最后一次相加的时候,发生进位,那么这个进位数往那放?你要明白:此时 while循环已经结束了。那我们该怎么处理这个进位数?

答:既然发生了进位,carry 一定是大于0的,这点我们是可以确定的!我们学的是java,要知道java,万物皆对象,没有一个节点去存储它,我就new一个节点给它。害怕它没对象要?
在这里插入图片描述


最后附上程序

/**
 * 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 head = null,tail = null;
        int carry = 0;
        while(l1 != null || l2 !=null){
            int val1 = l1!=null ? l1.val : 0;
            int val2 = l2!=null ? l2.val : 0;
            int sum = val1 + val2 + carry;
            if(head==null){
                // 第一次存入数据节点时: 头尾节点 应该都指向该节点
                head = tail = new ListNode(sum%10);
            }else{// 非第一次存入数据节点
                tail.next = new ListNode(sum%10);
                tail = tail.next;
                // 这就是 链表的 add功能,默认 add添加到屁股位置
            }
            carry = sum/10; // 获取此时 l1 和 l2 节点val值之和的十位数
            if(l1 != null){
                l1 =l1.next;
            }
            if(l2 != null){
                l2 = l2.next;
            }
        }
        if(carry>0){
            tail.next = new  ListNode(carry);
            // 这里就不用担心它是两位数,因为每个节点val都是一位,相加的结果不可能是 3位数。
            // 最多2 位数,再加上前面我们对其进行 “/10” ,所以 carry 铁定是一位数

            tail = tail.next; // 最后别忘记了,尾巴节点,永远指向链表的尾节点
        }
        return head;
    }
}

在这里插入图片描述


文章最后,我交代一下, 那个 判断 carry 的代码,你可以 放到 计算 和sum的后面,所以请不要迟疑,因为后面的代码,不受 carry 代码 位置的影响。

在这里插入图片描述

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dark And Grey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值