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


    给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

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

    示例1:

    输入:l1 = [7,2,4,3], l2 = [5,6,4]
    输出:[7,8,0,7]
    

    示例2:

    输入:l1 = [2,4,3], l2 = [5,6,4]
    输出:[8,0,7]
    

    示例3:

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

    提示:

    • 链表的长度范围为 [1, 100]
    • 0 <= node.val <= 9
    • 输入数据保证链表代表的数字无前导 0
    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. l1 = reverse(l1);
    14. l2 = reverse(l2);
    15. int flag = 0;
    16. ListNode tmp = l1;
    17. ListNode pre = l1;
    18. while(l1!=null || l2!=null) {
    19. int add1 = l1 == null ? 0 : l1.val;
    20. int add2 = l2 == null ? 0 : l2.val;
    21. int sum = flag+add1+add2;
    22. flag = sum/10;
    23. sum = sum%10;
    24. if(l1 != null) {
    25. if(l1 != tmp) pre = pre.next;
    26. l1.val = sum;
    27. l1 = l1.next;
    28. } else {
    29. ListNode x = new ListNode(sum);
    30. pre.next = x;
    31. pre = x;
    32. }
    33. if(l2 != null) l2 = l2.next;
    34. }
    35. if(flag != 0) {
    36. ListNode x = new ListNode(flag);
    37. pre.next = x;
    38. pre = x;
    39. }
    40. l1 = reverse(tmp);
    41. return l1;
    42. }
    43. public ListNode reverse(ListNode l1) {
    44. ListNode pre = l1;
    45. ListNode now = l1.next;
    46. ListNode tmp;
    47. while(now != null) {
    48. tmp = now.next;
    49. now.next = pre;
    50. pre = now;
    51. now = tmp;
    52. if(tmp == null) break;
    53. }
    54. l1.next = null;
    55. l1 = pre;
    56. return l1;
    57. }
    58. }

            今天是一道中等题。还是链表相关的。实际上和昨天的题目差不多。

            今天这道题仍然是链表相关的加法题。但今天这道题就没昨天那么顺了。最快想到的思路应该就是反转链表了。反转链表,之后再使用昨天的方法进行相加。博主这里直接使用l1链表来存储结果。由于是链表,要注意null的情况。所以需要一个pre的指针来指向l1的前一个,这里是由于用l1来存储结果,如果l1是位数较小的数,那么就需要新建链表结点。所以需要一个pre来存住链表的最后一个位置,而l1则可以继续作为判断的标准。这样全加完之后,有可能有进位,就需要再对flag最后处理一次。处理完反转链表即可。

            这是通过的情况:

     

            那么,问题来了?不能反转链表的话,应该怎么做?首先,我们注意到这里是从头部开始。加法运算是从尾部加上来。那反转顺序会想到什么?栈!,先进后出的数据结构。我们可以创建两个栈,把所有数字都放入这两个栈, 再逐个取出,相加,计算进位。并使用头插的方法创建链表(不要思维定式了,觉得链表next就只能往后加。)这样就可以实现不反转的解题啦。

            其他的解法,大家可以去力扣看看原题的题解。有更多解法也可以发在评论区,大家一起讨论。

  • 相关阅读:
    mysql 表的操作以及字段的操作总结
    python3-端口扫描(TCP_ACK扫描,NULL扫描,windows扫描,xmas扫描)
    剑指offer 49. 最长不含重复字符的子字符串
    前端学习笔记 第1集:WebStorm 安装、vue3.0 安装、npm安装
    Linux多线程
    知识图谱和 LLM:利用 Neo4j 实现大型语言模型
    基础算法--理解递归
    ISP住宅网络的特点是什么
    解锁区块链游戏数据解决方案
    Unity与IOS⭐Xcode打包,上架TestFlight的完整教程
  • 原文地址:https://blog.csdn.net/C_Ryson/article/details/132840644