leetcode 445. Add Two Numbers II

来源:互联网 发布:js settimeout管理 编辑:程序博客网 时间:2024/06/05 14:21

题面:

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.

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

解题思路:

刚看到题目首先想到的是将链表直接转换成int型,然后用内置类型的加法后再重新生成一条结果链表,但是这样做没有锻炼到关于指针的使用能力,所以还是老老实实地用竖式计算的思想来完成。

因为竖式计算需要将两个加数右对齐,但是题目不允许将链表翻转,所以我们只能利用栈的FILO的特性,将链表的每个结点压栈,最后,只需要一些简单的指针操作就能完成结果链表的生成。

代码如下:

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {        stack<int> s1, s2;        while (l1 != NULL) {            s1.push(l1->val);            l1 = l1->next;        }        while (l2 != NULL) {            s2.push(l2->val);            l2 = l2->next;        }        int carry = 0;        ListNode* result = NULL;        while (!s1.empty() && !s2.empty()) {            int value = s1.top() + s2.top() + carry;            carry = value > 9? 1 : 0;            ListNode* temp = new ListNode(value % 10);            temp->next = result;            result = temp;            s1.pop(); s2.pop();        }        stack<int> &s = s1.empty()? s2 : s1;        while (!s.empty()) {            int value = s.top() + carry;            carry = value > 9? 1 : 0;            ListNode* temp = new ListNode(value % 10);            temp->next = result;            result = temp;            s.pop();        }        if (carry == 1) {            ListNode* temp = new ListNode(carry);            temp->next = result;            result = temp;        }        return result;    }};
原创粉丝点击