IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> [Leetcode篇]链表中的两数相加 -> 正文阅读

[数据结构与算法][Leetcode篇]链表中的两数相加

题目描述:

剑指offerII 025
在这里插入图片描述

💌算法思路:

相信许多人拿到这个题的时候,会想这不就so easy嘛,直接让两数每个数字位上的元素相加不就完事了吗?
不不不,我们要注意的是题目中的描述,他说数字的最高位在单链表的头节点,而最低位在单链表的尾节点,学习过链表基础的同学,肯定会想单链表只能从头节点遍历到尾节点,我们在数字相加的时候,要从低位加起,所以要从链表的尾节点遍历到链表的头节点,所以说求解此题第一步,翻转两个要进行相加的链表。到了第二步,我们在数字相加的时候要注意满10进1,千万不要忘记了,类似的当相加之后,是999 + 9 = 1018时,还要在申请一个空间来存放进1的那一位。注意相加之后的链表,是从个位遍历到高位的,也就是说链表还要进行翻转,这样头节点才能指向最高位数字,从而读出相加之后的数字。

看图说话:
在这里插入图片描述

💯代码:

 
 public Node addList() {
    //第一步翻转链表
        headA = reverseList(headA);
        headB = reverseList(headB);
        //链表相加
        Node node = addNode(headA,headB);
        return reverseList(node);
    }

    public Node addNode(Node headA,Node headB){
        Node dummy = new Node(-1); //建立虚拟节点
        Node cur = dummy;
        int sum = 0;
        int carry = 0;
        while(headA != null || headB != null){
            sum = (headA == null ? 0 : headA.val) + (headB == null ? 0 : headB.val) + carry;
            carry = sum >= 10 ? 1 : 0;//进一
            //如果两个数相加大于10,那么就在这一位保留sum - 10
            sum = sum >=10 ? sum - 10 : sum;
            //新建节点,把计算后的值,放到新建节点中
            Node newNode = new Node(sum);
            cur.next = newNode;
            cur = cur.next;
            //遍历两个相加链表
            headA = headA == null ? null : headA.next;
            headB = headB == null ? null : headB.next;
        }
        if(carry > 0){
            cur.next = new Node(carry);
        }
        return dummy.next;
    }
    //翻转链表
    public Node reverseList(Node node){
        Node newhead = null;
        Node cur = node;
        while(cur!=null){
            Node curNext = cur.next;
            cur.next = newhead;
            newhead = cur;
            cur = curNext;
        }
        return newhead;
    }
   //链表打印
    public void print(Node node){
        Node cur = node;
        while(cur!=null){
            System.out.print(cur.val + " ");
         cur = cur.next;
        }
    }

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 11:24:08  更:2021-09-06 11:24:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:28:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码