[牛客算法总结]:链表相加(二)

  

标签:

链表、栈

 

题目:

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
数据范围:0 \le n,m \le 10000000≤n,m≤1000000,链表任意值 0 \le val \le 90≤val≤9
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)

例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。

请添加图片描述

输入:[9,3,7],[6,3]
返回值:{1,0,0,0}
说明:如题面解释

输入:[0],[6,3]
返回值:{6,3}

 

反思:

  首先我们由于我们计算是从个位数开始算起的,所以我们需要将两个链表反转过来,然后由于是加法进位操作,我们需要定义一个进位变量来记录,又因为我们在相加的时候,有可能链表1取出来的值为空、链表2取出来的值为空、我们的进位不等于0,这个时候,我们都需要进行处理,如果去出来的值为空,那么我们需要返回0,因为有可能这个时候进位不为0。
  其次我们需要在总和的时候注意要将进位加上,我们为什么要加上它?在各位数的时候,它一定是0,所以加上它没有什么影响,而个位数加完之后,进位可能是1了,这个时候,我们就需要加上去。所以要将它加到总和里面去。
  最后一个需要注意的就是,我们在定义指针和指针的移动(这里是难点),我们把名字定义好,见名知意就容易理解了。

具体步骤

  • step 1:将链表放入栈中
  • step 2:定义进位值、定义接收取模后的值、定义被newNode指向的值
  • step 3:取出栈中的值进行相加,注意总和需要加上进位
  • step 4:返回定义被newNode指向的值
     

用到的知识点:

链表、栈

 

代码:

public class Solution {
    /**
     *
     * @param head1 ListNode类
     * @param head2 ListNode类
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
        // write code here
        // 将链表放入栈中
        Stack<Integer> stack1 = getStack(head1);
        Stack<Integer> stack2 = getStack(head2);

        // 定义进位值
        int upVal = 0;

        ListNode newNode = null;// 定义接收取模后的值
        ListNode tail = null;// 定义被newNode指向的值

        // 取出栈中的值进行相加
        while (!stack1.isEmpty() || !stack2.isEmpty() || upVal != 0) {
            int popFromStack1 = stack1.isEmpty() ? 0 : stack1.pop();
            int popFromStack2 = stack2.isEmpty() ? 0 : stack2.pop();
            // 这个进位 最多是1,因为最大是9 + 9 +1 = 19
            int sum = popFromStack1 + popFromStack2 + upVal;
            upVal = sum / 10;
            // 下面的难理解一些,我们用数字来理解
            //  [9,3,7]
            //    [6,3]
            //[1,0,0,0]
            newNode = new ListNode(sum % 10);
            newNode.next = tail;
            tail = newNode;
        }
        return tail;


    }

    public Stack<Integer> getStack(ListNode node) {
        Stack<Integer> stack = new Stack();
        while (node != null) {
            stack.push(node.val);
            node = node.next;
        }
        return stack;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值