• [LeetCode] 445. Add Two Numbers II 两个数字相加之二


    You are given two linked lists representing two non-negative numbers. 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

    2. Add Two Numbers 的变形,之前的题最高位在链表末位,此题链表头部表示高位,尾部表示低位,不允许反转链表。两个数相加需要从低位开始。可以利用Stack的特点后进先出,遍历两个链表,将数字分别压入两个栈s1和s2,然后开始循环,如果栈不为空,则将栈顶数字加入sum中。

    Java:

    public class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            Stack<Integer> s1 = new Stack<Integer>();
            Stack<Integer> s2 = new Stack<Integer>();
    
            while(l1 != null) {
                s1.push(l1.val);
                l1 = l1.next;
            };
            while(l2 != null) {
                s2.push(l2.val);
                l2 = l2.next;
            }
    
            int sum = 0;
            ListNode list = new ListNode(0);
            while (!s1.empty() || !s2.empty()) {
                if (!s1.empty()) sum += s1.pop();
                if (!s2.empty()) sum += s2.pop();
                list.val = sum % 10;
                ListNode head = new ListNode(sum / 10);
                head.next = list;
                list = head;
                sum /= 10;
            }
    
            return list.val == 0 ? list.next : list;
        }
    }

    Python:

    class Solution(object):
        def addTwoNumbers(self, l1, l2):
            stk1, stk2 = [], []
            while l1:
                stk1.append(l1.val)
                l1 = l1.next
            while l2:
                stk2.append(l2.val)
                l2 = l2.next
    
            prev, head = None, None
            sum = 0
            while stk1 or stk2:
                sum /= 10
                if stk1:
                    sum += stk1.pop()
                if stk2:
                    sum += stk2.pop()
                
                head = ListNode(sum % 10)
                head.next = prev
                prev = head
    
            if sum >= 10:
                head = ListNode(sum / 10)
                head.next = prev
    
            return head
    

     C++:

    class Solution {
    public:
        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
            stack<int> stk1, stk2;
            while (l1) {
                stk1.emplace(l1->val);
                l1 = l1->next;
            }
            while (l2) {
                stk2.emplace(l2->val);
                l2 = l2->next;
            }
    
            ListNode *prev = nullptr, *head = nullptr;
            int sum = 0;
            while (!stk1.empty() || !stk2.empty()) {
                sum /= 10;
                if (!stk1.empty()) {
                    sum += stk1.top();
                    stk1.pop();
                }
                
                if (!stk2.empty()) {
                    sum += stk2.top();
                    stk2.pop();
                }
                
                head = new ListNode(sum % 10);
                head->next = prev;
                prev = head;
            }
    
            if (sum >= 10) {
                head = new ListNode(sum / 10);
                head->next = prev;
            }
            
            return head;
        }
    };
    

      

    相似题目:

    [LeetCode] 2. Add Two Numbers 两个数字相加

    [LeetCode] 67. Add Binary 二进制数相加 

    [LeetCode] 445. Add Two Numbers II 两个数字相加之二

  • 相关阅读:
    ASP.NET 母版页和内容页中的事件
    用powershell 获取windows窗口标题
    PowerShell中格式化命令和输出命令
    Powershell视频教程
    百度谷歌眼中的80后90后
    oracle导出和导入
    Websphere 优化文档
    windows 全部命令
    Oracle SQL 语句一
    怎样启动、关闭和重新启动oracle监听器 in linux
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8486648.html
Copyright © 2020-2023  润新知