算法练习:两数相加

题目描述:

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

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

进阶:

如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。

示例:

输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7

解题思路

看到这个题时,就应该明白用 栈 进行处理

  1. 将两个单向线标的数字放进不同的栈中
  2. 从栈顶以此取出数据相加,如果相加大于10就进位1,不然进位0
  3. 将相加的数一次链接成链表,返回首地址

解题代码:

 public static NodeDemo addTwoNumbers(NodeDemo l1, NodeDemo l2) {

        StackDemo<Integer> stack1 = new StackDemo<Integer>();
        StackDemo<Integer> stack2= new StackDemo<Integer>();

        while (l1!=null){
            stack1.push(l1);
            l1 = l1.getNext();
        }
        while (l2!=null){
            stack2.push(l2);
            l2 = l2.getNext();
        }
        Integer jinwei = 0;
        NodeDemo result = null;
        System.out.println(1);
        while(!stack1.isEmpty()||!stack2.isEmpty()){
            int re1 = stack1.isEmpty()? 0 : stack1.pop().getValue();
            int re2 = stack2.isEmpty()? 0 : stack2.pop().getValue();
            int a = (re1+re2)%10;
            NodeDemo node = new NodeDemo(a+jinwei);
            System.out.println(a+jinwei);
            node.setNext(result);
            result = node;

            jinwei = (re1+re2)/10;
        }

        return result;
    }

知识拓展:

栈的创建及入栈出栈等方法
栈节点定义:

public class Nodeclass<T> {

    private T data ;
    private Nodeclass<T> next;

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public Nodeclass<T> getNext() {
        return next;
    }

    public void setNext(Nodeclass<T> next) {
        this.next = next;
    }

    @Override
    public String toString() {
        return "Nodeclass{" +
                "data=" + data +
                ", next=" + next +
                '}';
    }
}

栈创建及方法定义:

public class Stack_demo1<T> {

    Nodeclass<T> stack  = new Nodeclass<T>();

    //入栈的方法
    public void push(Nodeclass add){
        if (stack == null){
            stack = add;
        }else{
            add.setNext(stack);
            stack = add;
        }
    }
    //出栈的方法
    public Nodeclass<T> pop(){
        Nodeclass<T> res = stack;
        if(stack != null){

            stack = stack.getNext();

        }
       return res;
    }

    //判断为空,为空返回true
    public Boolean isEmpty(){
        if (stack == null){
            return true;
        }else{
            return false;
        }
    }

    //查看栈顶元素
    public Nodeclass<T> top(){
        return stack;
    }
}

个人收获:

栈结构确实是很有用,首次接触数据结构就了解到栈,一个先进后出的数据结构 ,上面栈的定义代码是大概半年前写的,当时为了学习栈的思想,但是总是找不到java自带的栈,所以只能手写一个,不过写了一遍之后可能两年之内不会忘记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值