[C++] LeetCode 两数相加 II

题目

给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。

示例:

输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 8 -> 0 -> 7

思路解析

这题的思路比较多,可以考虑将链表先反转,然后相加,得到结果后再反转回来即可。
也可以考虑用递归。如果不修改原始链表也可以考虑用栈来实现。递归和栈的实现思路是一样的,只是实现的方式不同而已。

解法一 用栈

/**
 * 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) {
        if(l1==NULL||l1->val==0) return l2;
        if(l2==NULL||l2->val==0) return l1;
        stack<ListNode *>st1,st2;
        while(l1||l2){
            if(l1){
                st1.push(l1);
                l1=l1->next;
            }
            if(l2){
                st2.push(l2);
                l2=l2->next;
            }
        }
        ListNode *root= new ListNode(1);
        int flag=0;
        while(!st1.empty()||!st2.empty()){
            ListNode *p=new ListNode(0);
            int tmp1=0,tmp2=0;
            if(!st1.empty()){
                tmp1=st1.top()->val;
                st1.pop();
            }
            if(!st2.empty()){
                tmp2=st2.top()->val;
                st2.pop();
            }
            //cout<<tmp1<<" "<<tmp2<<endl;
            p->val=(tmp1+tmp2+flag)%10;
            flag=(tmp1+tmp2+flag)/10;
            p->next=root->next;
            root->next=p;
        }
        return flag==1?root:root->next;
    }
};

运行结果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/lv1224/article/details/80956031
今日推荐