【leetcode】2. 兩數相加 詳解

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, 避免了很多異常情況

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章