week2-leetcode #2-Add two Numbers[Medium]

leetcode #2-Add two Numbers[Medium]

Question

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Example

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)

Output: 7 -> 0 -> 8

Solution1[base]

time complecity: O(n)

space complecity: O(n)

runtime:53ms

class Solution {
public:
  ListNode* addTwoNumbers(ListNode* l1_head, ListNode* l2_head) {
    ListNode* l1_seq = l1_head;
    ListNode* l2_seq = l2_head;
    ListNode* l3_head = new ListNode(0);
    ListNode* l3_seq = l3_head;

    int carry = 0;
    int sum = 0;
    bool flag = true;
    while (l1_seq->next != NULL && l2_seq->next != NULL) {
      int l1_number = l1_seq->val;
      int l2_number = l2_seq->val;
      int add = l1_number+l2_number+carry;
      sum = add%10;
      carry = add/10;
      // 第一次
      if (flag == true) {
        l3_seq->val = sum;
        flag = false;
      } else {
        l3_seq->next = new ListNode(sum);
        l3_seq = l3_seq->next;
      }
      l1_seq = l1_seq->next;
      l2_seq = l2_seq->next;
    }

    // 最后一次两个都可以相加
    int l1_number = l1_seq->val;
    int l2_number = l2_seq->val;
    int last_add = l1_number+l2_number+carry;
    sum = last_add%10;
    carry = last_add/10;
    // 第一次
    if (flag == true) {
      l3_seq->val = sum;
      flag = false;
    } else {
      l3_seq->next = new ListNode(sum);
      l3_seq = l3_seq->next;
    }

    if (l1_seq->next == NULL && l2_seq->next == NULL && carry != 0) {
      l3_seq->next = new ListNode(carry);
    }

    l1_seq = l1_seq->next;
    l2_seq = l2_seq->next;
    while (l1_seq != NULL) {
      last_add = l1_seq->val+carry;
      sum = last_add%10;
      carry = last_add/10;
      l3_seq->next = new ListNode(sum);
      l3_seq = l3_seq->next;
      l1_seq = l1_seq->next;
      if (l1_seq == NULL && carry != 0) {
        l3_seq->next = new ListNode(carry);
      }
    }

    while (l2_seq != NULL) {
      last_add = l2_seq->val+carry;
      sum = last_add%10;
      carry = last_add/10;
      l3_seq->next = new ListNode(sum);
      l3_seq = l3_seq->next;
      l2_seq = l2_seq->next;
      if (l2_seq == NULL && carry != 0) {
        l3_seq->next = new ListNode(carry);
      }
    }
    return l3_head;
  }
};

​ 思路:实现考虑了很多种情况:

  1. l1有多个,l2有多个,不产生进位

  2. l1有多个,l2有多个,产生进位

  3. l1有一个,l2有多个,不产生进位

  4. l1有一个,l2有多个,产生进位

  5. ….

    所以代码很长,逻辑不清楚

Solution2[optimal]

time complecity: O(n)

space complecity: O(n)

runtime:51ms

class Solution {
public:
  ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    ListNode preHead(0), *p = &preHead;
    int extra = 0;
    while (l1 || l2 || extra) {
      int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) + extra;
      extra = sum / 10;
      p->next = new ListNode(sum % 10);
      p = p->next;
      l1 = l1 ? l1->next : l1;
      l2 = l2 ? l2->next : l2;
    }
  return preHead.next;
  }
};

思路:将问题简化,考虑l1,l2和进位决定是否增加一个ListNode,虽然复杂度差不多,但是代码量大大减少。逻辑清晰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值