欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實現(xiàn)算法兩個數(shù)字相加詳解

 更新時間:2021年07月09日 09:35:48   作者:Grandyang  
這篇文章主要介紹了C++實現(xiàn)算法兩個數(shù)字相加詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下

Add Two Numbers 兩個數(shù)字相加

You have two numbers represented by a linked list, where each node contains a single digit. The digits are stored in reverse order, such that the 1's digit is at the head of the list. Write a function that adds the two numbers and returns the sum as a linked list.
EXAMPLE
Input: (7-> 1 -> 6) + (5 -> 9 -> 2).That is, 617 + 295.
Output: 2 -> 1 -> 9.That is, 912.
FOLLOW UP
Suppose the digits are stored in forward order. Repeat the above problem.
EXAMPLE
Input: (6 -> 1 -> 7) + (2 -> 9 -> 5).That is, 617 + 295.
Output: 9 -> 1 -> 2.That is, 912.

LeetCode上的原題,請參考另一篇文檔Add Two Numbers 兩個數(shù)字相加。

跟那道LeetCode有所不同的是,這道題還有個Follow Up,把鏈表存的數(shù)字方向變了,原來是表頭存最低位,現(xiàn)在是表頭存最高位。既然是翻轉(zhuǎn)了鏈表,那么一種直接的解法是把兩個輸入鏈表都各自翻轉(zhuǎn)一下,然后用之前的方法相加完成,再把得到的結(jié)果翻轉(zhuǎn)一次,就是結(jié)果了,翻轉(zhuǎn)鏈表的方法可以參考另一篇文檔Reverse Linked List 倒置鏈表。代碼如下:

解法一:

// Follow up
class Solution {
public:
    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
        ListNode *dummy = new ListNode(-1);
        ListNode *cur = dummy;
        int carry = 0;
        l1 = reverseList(l1);
        l2 = reverseList(l2);
        while (l1 || l2) {
            int n1 = l1 ? l1->val : 0;
            int n2 = l2 ? l2->val : 0;
            int sum = n1 + n2 + carry;
            carry = sum / 10;
            cur->next = new ListNode(sum % 10);
            cur = cur->next;
            if (l1) l1 = l1->next;
            if (l2) l2 = l2->next;
        }
        if (carry) cur->next = new ListNode(1);
        return reverseList(dummy->next);
    }
    ListNode *reverseList(ListNode *head) {
        if (!head) return head;
        ListNode *dummy = new ListNode(-1);
        dummy->next = head;
        ListNode *cur = head;
        while (cur->next) {
            ListNode *tmp = cur->next;
            cur->next = tmp->next;
            tmp->next = dummy->next;
            dummy->next = tmp;
        }
        return dummy->next;
    }
};

如果我們不采用翻轉(zhuǎn)鏈表的方法該怎么做呢,這就比較復(fù)雜了。首先我們要縣分別計算出兩個鏈表的長度,然后給稍短一點的鏈表前面補0,補到和另一個鏈表相同的長度。由于要從低位開始相加,而低位是鏈表的末尾,所以我們采用遞歸來處理,先遍歷到鏈表的末尾,然后從后面相加,進位標示符carry用的是引用,這樣保證了再遞歸回溯時值可以正確傳遞,每次計算的節(jié)點后面接上上一次回溯的節(jié)點,直到回到首節(jié)點完成遞歸。最后還是處理最高位的進位問題。代碼如下:

解法二:

// Follow up
class Solution {
public:
    ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
        int n1 = 0, n2 = 0, carry = 0;;
        n1 = getLength(l1);
        n2 = getLength(l2);
        if (n1 > n2) l2 = padList(l2, n1 - n2);
        if (n2 > n1) l1 = padList(l1, n2 - n1);
        ListNode *res = addTwoNumbersDFS(l1, l2, carry);
        if (carry == 1) {
            ListNode *tmp = new ListNode(1);
            tmp->next = res;
            res = tmp;
        }
        return res;
    }
    ListNode *addTwoNumbersDFS(ListNode *l1, ListNode *l2, int &carry) {
        if (!l1 && !l2) return NULL;
        ListNode *list = addTwoNumbersDFS(l1->next, l2->next, carry);
        int sum = l1->val + l2->val + carry;
        ListNode *res = new ListNode(sum % 10);
        res->next = list;
        carry = sum / 10;
        return res;
    }
    ListNode *padList(ListNode *list, int len) {
        ListNode *dummy = new ListNode(-1);
        ListNode *cur = dummy;
        for (int i = 0; i < len; ++i) {
            cur->next = new ListNode(0);
            cur = cur->next;
        }
        cur->next = list;
        return dummy->next;
    }
    int getLength(ListNode *list) {
        ListNode *cur = list;
        int res = 0;
        while (cur) {
            ++res;
            cur = cur->next;
        }
        return res;
    }
};

到此這篇關(guān)于C++實現(xiàn)算法兩個數(shù)字相加詳解的文章就介紹到這了,更多相關(guān)C++實現(xiàn)兩個數(shù)字相加內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 從匯編看c++中默認構(gòu)造函數(shù)的使用分析

    從匯編看c++中默認構(gòu)造函數(shù)的使用分析

    c++中,如果為一個類沒有明確定義一個構(gòu)造函數(shù),那么,編譯器就會自動合成一個默認的構(gòu)造函數(shù)。下面,通過匯編程序,來看一下其真實情況
    2013-05-05
  • 在C語言中轉(zhuǎn)換時間的基本方法介紹

    在C語言中轉(zhuǎn)換時間的基本方法介紹

    這篇文章主要介紹了在C語言中轉(zhuǎn)換時間的基本方法,分別是mktime()函數(shù)和localtime()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08
  • Qt如何通過pos()獲取坐標信息

    Qt如何通過pos()獲取坐標信息

    這篇文章主要給大家介紹了關(guān)于Qt如何通過pos()獲取坐標信息的相關(guān)資料,文中通過代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用qt具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • 詳解C語言整數(shù)和浮點數(shù)在內(nèi)存中的存儲

    詳解C語言整數(shù)和浮點數(shù)在內(nèi)存中的存儲

    這篇文章主要介紹了C語言整數(shù)和浮點數(shù)在內(nèi)存中是如何存儲的,文中有詳細的代碼示例供大家參考,對大家了解學(xué)習(xí)C語言整數(shù)和浮點數(shù)在內(nèi)存中的存儲有一定的幫助,需要的朋友可以參考下
    2024-03-03
  • C++ 使用PrintWindow實現(xiàn)窗口截圖功能

    C++ 使用PrintWindow實現(xiàn)窗口截圖功能

    這篇文章主要介紹了C++ 如何使用PrintWindow實現(xiàn)窗口截圖功能,文中示例代碼非常詳細,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • 使用C/C++讀取matlab中.mat格式數(shù)據(jù)的操作

    使用C/C++讀取matlab中.mat格式數(shù)據(jù)的操作

    這篇文章給大家介紹了使用C/C++讀取matlab中.mat格式數(shù)據(jù)的操作,文中通過圖文結(jié)合的方式介紹的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • C語言編程數(shù)據(jù)結(jié)構(gòu)的棧和隊列

    C語言編程數(shù)據(jù)結(jié)構(gòu)的棧和隊列

    本篇文章是C語言編程篇,主要為大家介紹C語言編程中的數(shù)據(jù)結(jié)構(gòu),詳細的講解了數(shù)據(jù)結(jié)構(gòu)的棧和隊列有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • QT實現(xiàn)文件傳輸功能

    QT實現(xiàn)文件傳輸功能

    這篇文章主要為大家詳細介紹了QT實現(xiàn)文件傳輸功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言實現(xiàn)桶排序的方法示例

    C語言實現(xiàn)桶排序的方法示例

    這篇文章主要介紹了C語言實現(xiàn)桶排序的方法,簡單描述了桶排序的概念、原理并結(jié)合實例形式分析了C語言實現(xiàn)桶排序算法的具體操作技巧,需要的朋友可以參考下
    2018-01-01
  • 解析C++類內(nèi)存分布

    解析C++類內(nèi)存分布

    本篇文章介紹了C++類內(nèi)存分布結(jié)構(gòu),我們來看看編譯器是怎么處理類成員內(nèi)存分布的,特別是在繼承、虛函數(shù)存在的情況下
    2021-06-06

最新評論