LeetCode02 两数相加 Java版

1. 题目

给出两个非空的链表用来表示两个非负的整数, 其中他们各自的位数是按照逆序的方式存储的, 并且每个节点只能存储一位数字, 如果我们将这两个数相加起来会返回一个新的链表来表示他们的和
假设:这两个数都不会以0开头

2. 答案

/**
 * 给出两个非空的链表用来表示两个非负的整数, 其中他们各自的位数是按照逆序的方式存储的, 并且每个节点只能存储一位数字
 * 如果我们将这两个数相加起来会返回一个新的链表来表示他们的和
 * 假设:这两个数都不会以0开头
 */
public class Solution {

    /**
     * 输入两个链表
     * @param list 链表1
     * @param list2 链表2
     */
    public static void test(linkedList list, linkedList list2) {
        linkedList list3 = new linkedList();
        int nums = (list.getNums() > list2.getNums()) ? list.getNums() : list2.getNums();
        // 标识进位
        int bit = 0;
        int x;
        for (int i = 0; i < nums; i++) {
            // 短的链表会出现null的情况
            if (list.getFirst(i) == null) {
                x = 0;
            } else {
                x = list.getFirst(i).getNum();
            }
            int y = list2.getFirst(i).getNum();
            // 加法处理逻辑
            if (x + y > 9) {
                list3.add(new Node((x + y) % 10 + bit));
                bit = (x + y) / 10;
            } else {
                list3.add(new Node(x + y + bit));
                bit = (x + y) / 10;
            }
        }
        list3.list();

    }

    public static void main(String[] args) {
        // 测试demo
        linkedList list = new linkedList();
        list.add(new Node(9));
        list.add(new Node(1));
        linkedList list2 = new linkedList();
        list2.add(new Node(1));
        list2.add(new Node(2));
        list2.add(new Node(3));
        long startTime=System.currentTimeMillis();   //获取开始时间
        test(list, list2);
        long endTime=System.currentTimeMillis(); //获取结束时间
        System.out.println("程序运行时间: "+(endTime-startTime)+"ms");

    }
}

/**
 * 链表
 */
class linkedList {
    // 初始化头结点
    private Node head = new Node(0);

    // 获取最大的节点个数
    public int getNums() {
        int nums = 0;
        Node temp = head;
        while (true) {
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
            nums++;
        }
        return nums;
    }

    // 获取第n个节点
    public Node getFirst(int n) {
        Node temp = head;
        for (int i = 0; i < n + 1; i++) {
            temp = temp.next;
        }
        return temp;
    }

    // 打印链表
    public void list() {
        if (head.next == null) {
            return;
        }
        Node temp = head.next;
        while (true) {
            System.out.println(temp);
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
        }
    }

    // 添加功能
    public void add(Node node) {
        Node temp = head; // 因为头结点不能动,所以这里用一个辅助节点来操作
        while (true) {
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
        }
        temp.next = node;
    }

}

/**
 * 节点
 */
class Node {
    public Node(int num) {
        this.num = num;
    }

    int num;

    public void setNum(int num) {
        this.num = num;
    }

    public int getNum() {
        return num;
    }

    Node next;

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

3. 运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值