leetcode445. 两数相加 II

题目

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

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

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

示例

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

思路

此题与两数字相加I的区别是:

I 是正序相加

//两数相加I
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

II是逆序相加

//两数相加II
输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7

所以想到了栈。

使用栈的代码

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;
        }

        ListNode* dummyhead = NULL;
        int carry = 0;
        while(!s1.empty() || !s2.empty() ){
            //存储
            int x = s1.empty() ? 0:s1.top();
            int y = s2.empty() ? 0:s2.top();
            //相加
            int sum = x + y + carry;
            //进位
            carry = sum / 10;
            //在新的链表里存储相加的值
            ListNode* cur = new ListNode(sum % 10);
            //连接上头节点
            cur->next = dummyhead;
            //头节点的指针指向cur
            dummyhead = cur;
            if(!s1.empty()) s1.pop();
            if(!s2.empty()) s2.pop();
        }
        //还有1作为单独进位值的情况
        if(carry > 0){
            ListNode* cur = new ListNode(carry);
            cur->next = dummyhead;
            dummyhead = cur;
        }
        return dummyhead;
    }
};

注意点

1.哑结点的使用

// 空节点
ListNode* dummyhead = NULL
// 值为0节点
ListNode* dummyhead = new ListNode(0);
//值为1的节点
ListNode* dummyhead = new ListNode(1);

由于有些程序的返回是dummyhead->next,因此在定义哑结点为0或者1的时候才不会把哑结点的值返回回去,只有定义为NULL才不会返回值。

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页