• 【每日一题】2. 两数相加


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

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

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

    示例 1:

    输入:l1 = [2,4,3], l2 = [5,6,4]
    输出:[7,0,8]
    解释:342 + 465 = 807.
    

    示例 2:

    输入:l1 = [0], l2 = [0]
    输出:[0]
    

    示例 3:

    输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
    输出:[8,9,9,9,0,0,0,1]
    

    提示:

    • 每个链表中的节点数在范围 [1, 100] 内
    • 0 <= Node.val <= 9
    • 题目数据保证列表表示的数字不含前导零
    1. /**
    2. * Definition for singly-linked list.
    3. * public class ListNode {
    4. * int val;
    5. * ListNode next;
    6. * ListNode() {}
    7. * ListNode(int val) { this.val = val; }
    8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    9. * }
    10. */
    11. class Solution {
    12. public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    13. int flag = 0;
    14. int count = 0;
    15. ListNode ans = new ListNode(0);
    16. ListNode now = ans;
    17. while(l1 != null || l2 != null) {
    18. int add1 = l1 == null? 0 : l1.val;
    19. int add2 = l2 == null? 0 : l2.val;
    20. int sum = add1 + add2 + flag;
    21. flag = sum/10;
    22. sum = sum%10;
    23. if(count == 0) ans.val = sum;
    24. else {
    25. ListNode newNode = new ListNode(sum);
    26. now.next = newNode;
    27. now = newNode;
    28. }
    29. count++;
    30. if(l1 != null) l1 = l1.next;
    31. if(l2 != null) l2 = l2.next;
    32. }
    33. if(flag != 0) {
    34. ListNode newNode = new ListNode(flag);
    35. now.next = newNode;
    36. now = newNode;
    37. }
    38. return ans;
    39. }
    40. }

            今天是一道中等题。实际上也不算很难,对链表结构有所了解基本上就可以处理。

            看完题目。发现,欸,还是加法。这跟前几次的字符串加法,大数加法那些其实都差不多。而且,题目还很贴心,甚至链表都是倒序的。那就不需要再多处理什么,直接相加就行了。但,和字符串加法相同,都会出现两个数长度(位数)不一样的情况,所以需要判断,如果低位加完了,就使用0补高位。由于要返回链表头,所以链表头创建完就不要动了,用now来代替移动。只要l1或l2没有结束,就说明还要继续处理,进循环之后先判断,如果l1(l2)是空的,说明已经加完了,之后的位数需要使用0来补足。后面就是常规的计算了。加上前一位的进位就可以计算出这个位相加的结果。使用/10%10的基本操作来判断进位和余数。最后,如果加完flag还有数值,就说明有高进位,再处理一次就行了。(因为加法不可能产生n+2位数)。

            虽说是中等题,实际上不难,大家争取拿下。如果有更好的解法也可以发在评论区。

     

  • 相关阅读:
    计算机专业毕业设计演示视频(论文+系统)_kaic
    A Two-Stage Unsupervised Approach for Low Light Image Enhancement 论文阅读笔记
    Ai数字人直播系统SaaS源码大开源,源码独立部署助力中小企业发展!
    一个程序员,一生必须掌握的几种算法
    堆排序代码模板
    基于粒子群算法的电力系统无功优化研究(IEEE14节点)(Matlab代码实现)
    小红书笔记详情API:挖掘小红书社区的秘密宝藏
    88 合并两个有序数组
    Linux-正则三剑客
    分布式锁 - 理论篇
  • 原文地址:https://blog.csdn.net/C_Ryson/article/details/132812500