算法题:两数之和

原题是LeetCode中的第2题,我将题目做了下变形,原题中链表中的数字是逆序存储的,这里将它改为顺序存储,解法如下。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
#include <stack>
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {

        if(l1->val==0){
            return l2;
        }

        if(l2->val==0){
            return l1;
        }

        ListNode* p1=l1;
        ListNode* p2=l2;
        stack<int> p1stack;
        stack<int> p2stack;

        ListNode result;
        ListNode* l3=&result; 

        //将l1压入栈中
        p1stack.push(p1->val);
        while(p1->next != NULL){
            p1=p1->next;
            p1stack.push(p1->val);

        }

        //将l2压入栈中
        p2stack.push(p2->val);
        while(p2->next != NULL){
            p2=p2->next;
            p2stack.push(p2->val);

        }

        //将两个栈中的数字相加
        int temp=0;
        while((! p1stack.empty()) || (! p2stack.empty())){

            int sum=0;
            if((! p1stack.empty()) && (! p2stack.empty())){
                sum=p1stack.top()+p2stack.top();
                p1stack.pop();
                p2stack.pop();
            }
            else if(p1stack.empty()){
                sum=p2stack.top();
                p2stack.pop();
            }
            else{
                sum=p1stack.top();
                p1stack.pop();
            }

            sum=sum+temp;
            if(sum<10){
                ListNode* newnode=new ListNode(sum);
                l3->next=newnode;
                l3=newnode;
                temp=0;
            }
            else{
                ListNode* newnode=new ListNode(sum%10);
                l3->next=newnode;
                l3=newnode;
                temp=1;
            }

        }

        if(temp==1){
            ListNode* newnode=new ListNode(1);
            l3->next=newnode;
        }

        return result.next;
    }

};

猜你喜欢

转载自blog.csdn.net/qq_35771020/article/details/106089397