2. 两数相加 解题思路

设置哑结点,插入适当结点

左边到右边都是个位数开始, 所以进行模拟加法即可

  • 得到 位数值 注意:当指针指向空时 我们认为 此时值为0 便于处理
  • 进行加法模拟
  • 特殊情况分析 当两边结点扫描完 需要加入新结点时

例子

250 + 750, 需要多加1位 最高位

复杂度分析

空间复杂度 O(1)

时间复杂度 O(N)

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {

        // dummy 哑结点 插入适当结点
        // 左边到右边都是个位数开始, 所以进行模拟加法即可
        // if l1 or l2 == nullptr l1 l2 = 0
        // if l1 + l2 + jinwei <= 10 :
        //     加入 l1 + l2 
        //     jinwei = 0
        // else :
        //     加入 l1 + l2 + jinwei % 10 
        //     jinwei = 1

        ListNode* dummy = new ListNode(-1);
        ListNode* end = dummy;
        int x1 = 0, x2 = 0,  ifadd = 0;
		//x1 x2 表示相加的值  当指针指向空时 我们认为 此时 值为0 便于处理
        while (l1 != nullptr || l2 != nullptr) {
            if (l1 == nullptr) {
                x1 = 0;
            } else {
                x1 = l1->val;
                l1 = l1->next;
            }

             if (l2 == nullptr) {
                x2 = 0;
            } else {
                x2 = l2->val;
                l2 = l2->next;

            }
            cout << x1 << x2 << endl;

            if (x1 + x2 + ifadd < 10) {
                end->next = new ListNode(x1 + x2 + ifadd);
                ifadd = 0;
            } else {
                end->next = new ListNode((x1 + x2 + ifadd)%10);
                ifadd = 1;
            }
            end = end->next;
        


        }
        //特色情况分析 当结点扫描完 需要加入新结点时
        if (ifadd != 0) {
            end->next = new ListNode(1);
            end = end->next;
        }


        return dummy->next;


    }
};
心得

开始还想着 先把两个 数字提取出来

后面看例子发现 , 之所以给我们倒叙就是, 想让我们模拟加法操作

  • 实现过程中 依然用dummy 结点 来处理 没有结点的问题, 然后往链表里面尾加元素

    尾加元素

     end->next = new ListNode(1);
     end = end->next;
    
  • 巧妙的把 扫描到空的点 认为他的值为0, 避免了很多异常情况