LeetCode #445: Add Two Numbers II

Problem

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

题意

给定两个数字(以链表形式给出),求它们的和。
比如:7243+564 = 7807
题目会给出两个链表,分别为7 -> 2 -> 4 -> 3 与 5 -> 6 -> 4,要求得到两个数的和的链表形式。

思路

由于链表的性质,实现两个数的加法,一种方法就是从最后一位开始加,从个位往上,依次进位。
可以利用栈来实现这一目的。
将两个链表分别压入两个栈,s1和s2中,用carry表示进位,则每一位的结果就是s1.top() + s2.top() + carry(其中某个栈为空的情况下,则可以视作sx.top() = 0;在代码中则需要条件控制)
如果该位的结果大于等于10,则进位carry=1,留给下一位的计算;否则,carry=0。
计算完该位后两个栈分别pop一次,pop时要注意判断当前栈是否已空,防止程序崩溃。

Code

#include<stack>
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        //两个栈分别存放l1和l2
        stack<int> s1, s2;

        ListNode * l1_s1 = l1;
        ListNode * l2_s2 = l2;
        while(l1_s1 != NULL){
            s1.push(l1_s1->val);
            l1_s1 = l1_s1->next;
        }
        while(l2_s2 != NULL){
            s2.push(l2_s2->val);
            l2_s2 = l2_s2->next;
        }

        //由于给定的两个链表非空,所以个位一定存在,先构造个位的node
        ListNode * node = new ListNode(s1.top() + s2.top());
        //进位
        int carry = 0;
        //如果>=10,则进位
        if (node->val >= 10){
            carry = node->val / 10;
            node->val %= 10;
        }
        s1.pop();
        s2.pop();

        while(!(s1.empty() && s2.empty())){
            //由于ListNode没有提供默认构造函数,所以用0暂时代替,不会影响之后的构造
            previousNode = new ListNode(0);
            if (s1.empty()){
                previousNode->val = s2.top() + carry;
                s2.pop();
            }
            else if (s2.empty()){
                previousNode->val = s1.top() + carry;
                s1.pop();
            }
            else{
                previousNode->val = s1.top() + s2.top() + carry;
                s1.pop();
                s2.pop();
            }

            if (previousNode->val >= 10){
                carry = previousNode->val / 10;
                previousNode->val %= 10;
            }
            else   
                carry = 0;

            //构造链表
            previousNode->next = node;
            node = previousNode;
        }

        //例如5+5,pop一次后,两个栈都空,但carry不为0,就需要再构造一个高位
        if (s1.empty() && s2.empty() && carry != 0){
            previousNode = new ListNode(carry);
            previousNode->next = node;
            node = previousNode;
        }

        return node;
    }
};

Summary

  1. 虽然难度是Medium,但是代码实现并不是特别复杂,但是对于条件的判断需要细心一点,否则容易造成Runtime Error
  2. 想到借助栈来实现从链表尾部开始的加法也需要过程
  3. 本周写了三道题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值