栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

牛客网高频算法题系列-BM11-链表相加(二)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

牛客网高频算法题系列-BM11-链表相加(二)

牛客网高频算法题系列-BM11-链表相加(二) 题目描述

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。给定两个这种链表,请生成代表两个整数相加值的结果链表。

原题目见:BM11 链表相加(二)

解法一:使用栈

首先,特殊情况判断:

  • 如果链表一为空,则直接返回链表二
  • 如果链表二为空,则直接返回链表一

否则,使用2个栈用来存放两个链表的结点:

  • 首先将两个链表中的结点添加到栈中;
  • 遍历2个栈,即执行加法,将值添加到新的栈中这样可以按倒序进行结点值相加,其中需要使用一个变量记录进位值;
  • 需要注意的是,遍历结束后,需要根据进位值判断是否需要添加额外的结点;
  • 最后,根据新的栈构造相加后的链表并返回之。

如果不想使用多余的栈空间,可以考虑先将两个链表倒序排列后,再执行加法。

代码
import java.util.Stack;

public class Bm011 {

    
    public static ListNode addInList(ListNode head1, ListNode head2) {
        // 如果链表一为空,则直接返回链表二
        if (head1 == null) {
            return head2;
        }
        // 如果链表二为空,则直接返回链表一
        if (head2 == null) {
            return head1;
        }
        // 2个栈用来存放两个链表的结点
        Stack nodes1 = new Stack<>();
        Stack nodes2 = new Stack<>();
        while (head1 != null) {
            nodes1.push(head1);
            head1 = head1.next;
        }
        while (head2 != null) {
            nodes2.push(head2);
            head2 = head2.next;
        }

        // 记录进位值
        int addOne = 0;
        Stack newNodes = new Stack<>();
        // 遍历栈,即执行加法,将值添加到新的栈中
        while (!nodes1.isEmpty() || !nodes2.isEmpty()) {
            int val1 = 0, val2 = 0, newVal = 0;
            if (!nodes1.isEmpty()) {
                val1 += nodes1.pop().val;
            }
            if (!nodes2.isEmpty()) {
                val2 += nodes2.pop().val;
            }
            newVal += addOne + val1 + val2;
            if (newVal > 9) {
                newVal = newVal % 10;
                addOne = 1;
            } else {
                addOne = 0;
            }
            newNodes.push(newVal);
        }
        if (addOne == 1) {
            newNodes.push(1);
        }
        ListNode newHead = new ListNode(-1);
        ListNode next = newHead;
        while (!newNodes.isEmpty()) {
            next.next = new ListNode(newNodes.pop());
            next = next.next;
        }
        return newHead.next;
    }

    public static void main(String[] args) {
        // 链表一: 1 -> 3 -> 5
        ListNode head1 = ListNode.testCase3();
        // 链表二: 2 -> 4 -> 6
        ListNode head2 = ListNode.testCase4();

        // 测试用例,期望输出: 3 -> 8 -> 1
        ListNode.print(addInList(head1, head2));
    }
}

1.0 1 365 ≈ 37.7834343329 1.01^{365} ≈ 37.7834343329 1.01365≈37.7834343329
0.9 9 365 ≈ 0.02551796445 0.99^{365} ≈ 0.02551796445 0.99365≈0.02551796445
相信坚持的力量!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/950085.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号