当前位置:  首页>> 技术小册>> 数据结构与算法(中)

内容描述

  1. 给出两个非空链表,表示两个非负整数。数字以相反的顺序存储,每个节点包含一个数字。将这两个数字相加,并将其作为链表返回。
  2. 你可以假设这两个数字不包含任何前导零,除了数字0本身。
  3. 例子:
  4. 输入:(2->4->3)+(5->6->4
  5. 输出:7->0->8
  6. 说明:342+465=807

解题方案

思路 1
**- 时间复杂度: O(N)**- 空间复杂度: O(1)**

迭代,每次只算个位数的相加

  1. class Solution {
  2. public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
  3. if (l1 == null) {
  4. return l2;
  5. }
  6. if (l2 == null) {
  7. return l1;
  8. }
  9. ListNode head = new ListNode(0);
  10. ListNode p = head;
  11. int tmp = 0;
  12. while(l1 != null || l2 != null || tmp != 0) {
  13. if(l1 != null) {
  14. tmp += l1.val;
  15. l1 = l1.next;
  16. }
  17. if(l2 != null) {
  18. tmp += l2.val;
  19. l2 = l2.next;
  20. }
  21. p.next = new ListNode(tmp % 10);
  22. p = p.next;
  23. tmp = tmp / 10;
  24. }
  25. return head.next;
  26. }
  27. }

思路 2
**- 时间复杂度: O(N)**- 空间复杂度: O(1)**

可以使用递归,每次算一位的相加, beats 70.66%

  1. class Solution {
  2. public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
  3. if (l1 == null && l2 == null) {
  4. return null;
  5. } else if (l1 == null || l2 == null) {
  6. return l1 != null ? l1: l2;
  7. } else {
  8. ListNode l3;
  9. if (l1.val + l2.val < 10) {
  10. l3 = new ListNode(l1.val + l2.val);
  11. l3.next = addTwoNumbers(l1.next, l2.next);
  12. } else {
  13. l3 = new ListNode(l1.val + l2.val - 10);
  14. l3.next = addTwoNumbers(l1.next, addTwoNumbers(l2.next, new ListNode(1)));
  15. }
  16. return l3;
  17. }
  18. }
  19. }

该分类下的相关小册推荐: