链表逆向加法,自己模拟加法规则|Java 刷题打卡

1,067 阅读2分钟

本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接

一、题目描述

2. 两数相加

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

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

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

image-20210527145119147

二、思路分析

image-20210527145712729

  • 首先两个链表长度不一。按照常规计算我们就从链表头部开始进行加操作。这个会有三个变量参与计算

image-20210527145944550

  • start、 end都很好理解就是两个链表中对应的值,up我们理解为寄存器因为我们两数相加会产生进位。

image-20210527150204557

  • 因为链表是可以不断追加的,我们不需要考虑越界的问题。

三、AC 代码

入口方法

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    List<Integer> list1 = getTotalFromListNode(l1);
    List<Integer> list2 = getTotalFromListNode(l2);
    List<Integer> totalList = addListInteger(list1,list2);
    ListNode node = getListNodeFromTotal(totalList);
    return node;
}

模拟加法

/**
 * 两个list相加 , 模拟加法
 * @param list1
 * @param list2
 * @return
 */
private List<Integer> addListInteger(List<Integer> list1, List<Integer> list2) {
    List<Integer> list = new ArrayList<>();
    Integer length = list1.size() > list2.size() ? list1.size() : list2.size();
    //进位管理器
    Integer up = 0;
    Integer start = 0;
    Integer end = 0;
    for (Integer i = 0; i < length; i++) {
        if (i < list1.size()) {
            start = list1.get(i);
        }
        if (i < list2.size()) {
            end = list2.get(i);
        }
        int total = start + end + up;
        //total个位存入新的list , 十位存入进位管理器
        up = total / 10;
        list.add(total % 10);
        //清空
        start = 0;
        end = 0;
    }
    //最后判断进位管理器是否有进位数据
    if (up != 0) {
        list.add(up);
    }
    return list;
}

private ListNode getListNodeFromTotal(List<Integer> totalList) {
    ListNode node = new ListNode(0);
    ListNode temNode = node;
    for (int i = 0; i < totalList.size(); i++) {
        ListNode subNode = new ListNode(totalList.get(i));
        temNode.next = subNode;
        temNode = subNode;
    }
    return node.next;
}

private List<Integer>  getTotalFromListNode(ListNode node) {
    List<Integer> list = new ArrayList<>();
    while (node != null) {
        list.add(node.val);
        node = node.next;
    }
    return list;
}

结果

image-20210527150335299

四、总结

  • 这道题是笔者接触leetcode的第一道。当时做出来还是很吃力的。运行的结果也么有超过一半。但是正是这道题打开了leetcode的学习大门。

image-20210527150520439

  • 知道最近又将这道题拿出来。看看之前的尝试全都是错误。这个也作为一个警示的作用。自己还需要不断的努力

点赞哈