来源

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

描述

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

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

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

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

题解

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) { val = x; }
  7. * }
  8. */
  9. class Solution {
  10. public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
  11. ListNode dummyHead = new ListNode(0);
  12. ListNode p = l1, q = l2, curr = dummyHead;
  13. int carry = 0;
  14. while (p != null || q != null) {
  15. int x = (p != null) ? p.val : 0;
  16. int y = (q != null) ? q.val : 0;
  17. int sum = x + y + carry;
  18. carry = sum / 10;
  19. curr.next = new ListNode(sum % 10);
  20. curr = curr.next;
  21. if (p != null) p = p.next;
  22. if (q != null) q = q.next;
  23. }
  24. if (carry != 0) {
  25. curr.next = new ListNode(carry);
  26. }
  27. return dummyHead.next;
  28. }
  29. }

复杂度分析

  • 时间复杂度:2. 两数相加(Add Two Numbers) - 图1。假设m和n分别表示l1和l2的长度,上面的算法最多重复2. 两数相加(Add Two Numbers) - 图2次;
  • 空间复杂度:2. 两数相加(Add Two Numbers) - 图3。新列表的长度最多为2. 两数相加(Add Two Numbers) - 图4+1;