题目描述

原题链接

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

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

  1. 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
  2. 输出:7 -> 0 -> 8
  3. 原因:342 + 465 = 807

个人解法

JavaScript

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val, next) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.next = (next===undefined ? null : next)
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} l1
  10. * @param {ListNode} l2
  11. * @return {ListNode}
  12. */
  13. var addTwoNumbers = function(l1, l2) {
  14. var node = new ListNode('0');
  15. var head = node;
  16. var temp = 0;
  17. while (l1 || l2 || temp) {
  18. var l1Val = l1 ? l1.val : 0;
  19. var l2Val = l2 ? l2.val : 0;
  20. temp = temp + l1Val + l2Val;
  21. node.next = new ListNode(temp % 10);
  22. node = node.next;
  23. temp = parseInt(temp / 10);
  24. l1 = l1 ? l1.next : l1;
  25. l2 = l2 ? l2.next : l2;
  26. };
  27. return head.next;
  28. };

遇到的问题

  1. 当 l1 或 l2 达到链表的尾的时候,需要进行判断,否则会报错
  2. 当遇到最后一位要产生进位的时候,我们要判断 temp 的值
  3. 获取 l1 或者 l2 的 value 的时候 要判断 是否为空

Java

更优解法

Java

标签:链表
将两个链表看成是相同长度的进行遍历,如果长度不同,则在链表尾部加0;例如输入(2->4->3)+(5->6),输出(7->0->4),原因是342+65=407,即(2->4->3)+(5->6->0)。
每次计算需要考虑进位的情况,并实时更新进位值。
如果两个链表都遍历完毕,进位值为1,则需要在链表尾部添加新节点1。
小技巧:对于链表问题,返回结果为头结点时,通常需要先初始化一个预先指针pre,该指针的下一个节点指向真正的头结点head。使用预先指针的目的在于链表初始化时无可用节点值,而且链表构造过程需要指针移动,进而会导致头指针丢失,无法返回结果。

  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 pre=new ListNode(0);
  14. ListNode cur=pre;
  15. int carry=0,x,y,sum;
  16. while(l1!=null||l2!=null){
  17. if(l1==null)
  18. x=0;
  19. else
  20. x=l1.val;
  21. if(l2==null)
  22. y=0;
  23. else
  24. y=l2.val;
  25. sum=carry+x+y;
  26. carry=sum/10;
  27. sum=sum%10;
  28. cur.next=new ListNode(sum);
  29. cur=cur.next;
  30. if(l1!=null)
  31. l1=l1.next;
  32. if(l2!=null)
  33. l2=l2.next;
  34. }
  35. if(carry==1)
  36. cur.next=new ListNode(carry);
  37. return pre.next;
  38. }
  39. }

画解:

1.
2.两数相加 - 图1
2.
2.两数相加 - 图2
3.
2.两数相加 - 图3
4.
2.两数相加 - 图4
5.
2.两数相加 - 图5
6.
2.两数相加 - 图6
7.
2.两数相加 - 图7
8.
2.两数相加 - 图8

JavaScript

  1. var addTwoNumbers = function(l1, l2) {
  2. let head = null, tail = null;
  3. let carry = 0;
  4. while (l1 || l2) {
  5. const n1 = l1 ? l1.val : 0;
  6. const n2 = l2 ? l2.val : 0;
  7. const sum = n1 + n2 + carry;
  8. if (!head) {
  9. head = tail = new ListNode(sum % 10);
  10. } else {
  11. tail.next = new ListNode(sum % 10);
  12. tail = tail.next;
  13. }
  14. carry = Math.floor(sum / 10);
  15. if (l1) {
  16. l1 = l1.next;
  17. }
  18. if (l2) {
  19. l2 = l2.next;
  20. }
  21. }
  22. if (carry > 0) {
  23. tail.next = new ListNode(carry);
  24. }
  25. return head;
  26. };