LeekCode2_链表反向存储+求和(中等)

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

解题

将长度较短的链表在末尾补零使得两个连表长度相等,再一个一个元素对其相加(考虑进位)

就是将取模后的数值放到结点中,每次相加都算上进位的数,到最后判断如果进位数字大于一,再创建一个结点放入数值。
在这里插入图片描述

//两个数相加
    public listNode2 addSum(listNode2 l1,listNode2 l2){
        //首先设置头结点和引用
        listNode2 head = null,tail = null;
        //设置进位
        int carry = 0;
        while (l1 != null || l2 != null){
            // 取出一个值,如果没有结点,则自动补零
            int i1 = l1 != null ? l1.val:0;
            int i2 = l2 != null ? l2.val:0;
            int sum = i1 + i2 + carry;  //得到本身加进位的
            int other = sum % 10;    //取模得出余数
            if (head == null) {        //如果不存在首节点创建
                head = new listNode2(other);    //给结点赋值
                tail = head;
            }else {
                tail.next = new listNode2(other);
                tail = tail.next;          //将指 针向后移动指向当前结点
            }

            if (l1!= null){
                l1 = l1.next;
            }
            if (l2!=null){
                l2 = l2.next;
            }
        }
        //如果最后还有进位,就需要再创建一个
        if (carry > 0 ){
            tail.next = new listNode2(carry);
        }
        return head;
    }

创建链表并反向存储

正好复习下链表的知识,以下用java写的创建和遍历

public class listNode2 {

    private int val;            //存放数据
    private listNode2 next;     //引用,相当于指针

    //无参构造用于初始化这个类 调用方法
    public listNode2(){}

    //用于初始化结点
    public listNode2(int x){
        this.val = x;
        this.next = null;
    }

    //用于创建结点(逆序存储数组中的数)
    public void create(int a[],listNode2 head){

        listNode2 tail = head;//一个变量,相当于指针移动
        for (int i = a.length-2; i >=0 ; i--) {
            listNode2 first = new listNode2(a[i]);//下一个结点
            tail.next = first;  //将结点连接起来
            tail = tail.next;   //移动到下一个结点
        }
        //遍历
        list(head);
    }

    //遍历链表
    public void list(listNode2 head){

        listNode2 tail = head;//定义一个变量用于遍历
        System.out.print("链表:");
        while (tail != null){
            System.out.print(tail.val+" ");
            tail = tail.next;
        }
        System.out.println();
    }

    //两个数相加
    public listNode2 addSum(listNode2 l1,listNode2 l2){
        //首先设置头结点和引用
        listNode2 head = null,tail = null;
        //设置进位
        int carry = 0;
        while (l1 != null || l2 != null){
            // 取出一个值,如果没有结点,则自动补零
            int i1 = l1 != null ? l1.val:0;
            int i2 = l2 != null ? l2.val:0;
            int sum = i1 + i2 + carry;  //得到本身加进位的
            int other = sum % 10;    //取模得出余数
            if (head == null) {        //如果不存在首节点创建
                head = new listNode2(other);    //给结点赋值
                tail = head;
            }else {
                tail.next = new listNode2(other);
                tail = tail.next;          //将指 针向后移动指向当前结点
            }

            if (l1!= null){
                l1 = l1.next;
            }
            if (l2!=null){
                l2 = l2.next;
            }
        }
        //如果最后还有进位,就需要再创建一个
        if (carry > 0 ){
            tail.next = new listNode2(carry);
        }
        return head;
    }
}

测试

public static void main(String[] args) {
        int l1[]={2,4,3};
        listNode2 list = new listNode2(l1[l1.length-1]);  //逆序数组创建头结点
        list.create(l1,list);

        int l2[]={5,6,4};
        listNode2 list2 = new listNode2(l2[l2.length-1]);  //逆序数组创建头结点
        list2.create(l2,list2);

        //测试结果两数之和
        listNode2 listNode2 = list.addSum(list, list2);
        list.list(listNode2);

    }

结果

链表:3 4 2
链表:4 6 5
链表:7 0 8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值