题目描述:给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 addtwonumber1.jpg

    :::info 1、规律:链表A和链表B的第i个节点的和为Sum=Ai.val + Bi.val + carry(进位),新的第i个节点的值应该为Sum%10,产生的新的进位为sum/10。 ::: :::danger 2、分析:链表A和链表B从第1个节点开始求和,当某一个链表的已有节点遍历完之后,另一个链表还有节点,那么遍历完的链表可以看做后面还有值为0的节点(因为这里是相加,任何一个数加0,还是这个数),如果是相乘,那么遍历完的链表可以看做后面是值为1的节点,因为任何一个数乘以1,还是这个数。 ::: :::success 3、步骤:① 设置初始进位carry为0,la纸箱链表A的头结点,lb指向链表B的头结点;由于不知道A和B那个链表更长,每一次都更新链表A和链表B的节点,设置res变量记录返回哪个链表;由于可能最后跳出循环的时候,还有进位,也就是carry不为0,所以设置last变量记录返回链表的最后一个节点在哪;
    ② 从头开始遍历链表A和B,循环条件为链表A当前节点(la)不为空或者链表B当前节点(lb)不为空,那么跳出循环的原因是A和B都遍历结束了;
    ③ 确定valA和valB的值,根据la和lb是否为空
    ④ sum = carry+valA+valB;
    ⑤ 更新carry的值:sum/10;
    ⑥ 如果la不为空,更新la的值为:sum%10;更新res为链表A;更新last为la;更新la为la.next;
    ⑦ 如果lb不为空,更新lb的值为:sum%10;更新res为链表B;更新last为lb;更新lb为lb.next;
    ⑧ 如果carry不为0,创建新的节点,节点的val初始值为carry,last指向该节点。
    ⑨ 返回链表res。 ::: :::info 4、代码:
    刚开始自己实现的 :::

    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. ListNode h1 = l1;
    14. ListNode h2 = l2;
    15. int carry = 0;
    16. int len1 = 0, len2 = 0;
    17. ListNode node = new ListNode();
    18. while(h1 != null){
    19. len1++;
    20. h1 = h1.next;
    21. }
    22. while(h2 != null){
    23. len2++;
    24. h2 = h2.next;
    25. }
    26. if(len1 >= len2){
    27. h1 = l1;
    28. h2 = l2;
    29. }else{
    30. h1 = l2;
    31. h2 = l1;
    32. }
    33. while(h1 != null && h2 != null){
    34. int val = h1.val + h2.val + carry;
    35. carry = val / 10;
    36. int rest = val % 10;
    37. h1.val = rest;
    38. if(h1.next == null){
    39. node = h1;
    40. }
    41. h1 = h1.next;
    42. h2 = h2.next;
    43. }
    44. while(h1 != null){
    45. int val = h1.val + carry;
    46. carry = val / 10;
    47. int rest = val % 10;
    48. h1.val = rest;
    49. if(h1.next == null){
    50. node = h1;
    51. }
    52. h1 = h1.next;
    53. }
    54. if(carry != 0){
    55. ListNode n = new ListNode(carry);
    56. node.next = n;
    57. }
    58. if(len1 >= len2){
    59. return l1;
    60. }else{
    61. return l2;
    62. }
    63. }
    64. }

    :::info 4、代码:
    看了题解之后自己实现的 :::

    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. ListNode h1 = l1;
    14. ListNode h2 = l2;
    15. int carry = 0;
    16. ListNode res = l1;
    17. ListNode last = l1;
    18. while(h1 != null || h2 != null){
    19. int valA = h1 == null ? 0 : h1.val;
    20. int valB = h2 == null ? 0 : h2.val;
    21. int sum = carry + valA + valB;
    22. carry = sum / 10;
    23. if(h1 != null){
    24. h1.val = sum % 10;
    25. res = l1;
    26. last = h1;
    27. h1 = h1.next;
    28. }
    29. if(h2 != null){
    30. h2.val = sum % 10;
    31. res = l2;
    32. last = h2;
    33. h2 = h2.next;
    34. }
    35. }
    36. if(carry > 0){
    37. ListNode node = new ListNode(carry);
    38. last.next = node;
    39. }
    40. return res;
    41. }
    42. }