zoukankan      html  css  js  c++  java
  • 【LeetCode】445. Add Two Numbers II

    You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first 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.

    Follow up:
    What if you cannot modify the input lists? In other words, reversing the lists is not allowed.

    Example:

    Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
    Output: 7 -> 8 -> 0 -> 7

    题解:

    Solution 1

      加和是从尾部开始的,而链表又只能从前开始遍历,那么这种单向的遍历顺序就及其适合用queue或者stack来辅助。显然此题用到的是stack。

     1 class Solution {
     2 public:
     3     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
     4         stack<int> s1, s2;
     5         while (l1) {
     6             s1.push(l1->val);
     7             l1 = l1->next;
     8         }
     9         while (l2) {
    10             s2.push(l2->val);
    11             l2 = l2->next;
    12         }
    13         int sum = 0;
    14         ListNode* pre = nullptr;
    15         while (!s1.empty() || !s2.empty() || sum) {
    16             if (!s1.empty()) {
    17                 sum += s1.top(); 
    18                 s1.pop();
    19             }
    20             if (!s2.empty()) {
    21                 sum += s2.top(); 
    22                 s2.pop();
    23             }
    24             ListNode *node = new ListNode(sum % 10);
    25             node->next = pre;
    26             pre = node;
    27             sum /= 10;
    28         }
    29         return pre;
    30     }
    31 };

    Solution 2

      设计的很巧妙,无需开辟存储空间。转自 Grandyang。用right记录目前最右第一个值不是9的元素。用cur遍历链表。如果cur遍历时有进位, 那么right自增1,且right到cur(左开右闭)之间的由于都是9(因为right指向的是目前最右第一个值不是9的元素),所以此区间内的元素值全部置0。

     1 class Solution {
     2 public:
     3     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
     4         int len1 = getLength(l1), len2 = getLength(l2);
     5         if (len1 < len2) 
     6             swap(l1, l2);
     7         ListNode* dummy = new ListNode(0);
     8         ListNode* cur = dummy, *right = dummy;
     9         int diff = abs(len1 - len2);
    10         
    11         while (diff) {
    12             cur->next = new ListNode(l1->val);
    13             cur = cur->next;
    14             if (cur->val != 9)
    15                 right = cur;
    16             l1 = l1->next;
    17             --diff;
    18         }
    19         while (l1) {
    20             int sum = l1->val + l2->val;
    21             cur->next = new ListNode(sum % 10);
    22             cur = cur->next;
    23             if (sum > 9) {
    24                 sum %= 10;
    25                 ++right->val;
    26                 right = right->next;
    27                 while (right!= cur) {
    28                     right->val = 0;
    29                     right = right->next;
    30                 }
    31             } 
    32             if (sum != 9)
    33                 right = cur;
    34             l1 = l1->next;
    35             l2 = l2->next;
    36         }
    37         
    38         return dummy->val == 0 ? dummy->next : dummy;
    39     }
    40     int getLength(ListNode* head) {
    41         if (!head)
    42             return 0;
    43         int len = 0;
    44         while (head) {
    45             ++len;
    46             head = head->next;
    47         }
    48         return len;
    49     }
    50 };
  • 相关阅读:
    BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树
    BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树
    单例模式
    JDBC连接数据库查询信息的步骤(提取成配置文件方式)
    JDBC访问数据库查询信息的步骤(硬编码格式)
    大数据
    accp
    递归
    struts2中Action到底是什么,怎么理解
    转发和重定向的区别(简单解释)
  • 原文地址:https://www.cnblogs.com/Atanisi/p/8846020.html
Copyright © 2011-2022 走看看