鏈表加法

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

從整體上來講是一個不太難的鏈表題,主要是要細心,考慮到各種情況。由於一個數是倒敘按位存放在鏈表當中,所以更加方便了存取和計算進位。總體而言,就是使用兩個臨時指針按順序一個節點一個節點往下走,每個節點計算兩數之和已經進位,然後帶進下一個節點的計算當中。但是由於ListNode裏面並沒有定義size或功能類似的變量,所以我們無法直接獲得鏈表了l1和l2 的長度,否則便可以直接定義l1爲較長的鏈表而l2爲較短的鏈表,從而使得計算更爲簡單。

所以我們只能選擇分情況考慮了。若是l1和l2恰巧等長,那自然是最好的,但我們也要考慮到更爲常見的不等長的情況。當鏈表l1的長度比l2長時,運算到後面的時候,會遇到l2已經爲空了但l1依舊有值,此時輸出result的值應爲l1節點中存放的值(+進位),l2已經到頂了,再往下找節點會導致越界。l2比l1長的時候同理。

但這裏不要忘了一個問題,最高位還是可能存在進位的,需要額外處理。

但是比起使用if~else語句分類考慮,還有更爲簡潔的方法,我們可以把超出短的鏈表的部分視作0,即判斷指針指向的當前節點是否爲空,不爲空則爲節點中的值,爲空則爲0,所以在計算result中的值時,只需要簡單的將記錄下來的節點中的值(或是0)和進位相加即可,無需分類討論,使得代碼更爲清晰簡潔。

當然最基礎的鏈表操作不要忘記了,本人在這裏犯了一個低級錯誤實在慚愧。

參考代碼如下:

/**
 * 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) {
        ListNode* l1_now = l1;
        ListNode* l2_now = l2;
        int carry = 0, value, x, y;
        ListNode* result = new ListNode(0);
        ListNode* result_now = result;
        while(l1_now != NULL || l2_now != NULL) {
            x = (l1_now != NULL) ? l1_now->val : 0;
            y = (l2_now != NULL) ? l2_now->val : 0;
            value = x + y + carry;
            carry = value / 10;
            result_now->next = new ListNode(value % 10);
            result_now = result_now->next;
            if(l1_now != NULL)
                l1_now = l1_now->next;
            if(l2_now != NULL)
                l2_now = l2_now->next;
        }
        if(carry != 0)
            result_now->next = new ListNode(carry);
        return result->next;
    }
};
發佈了30 篇原創文章 · 獲贊 1 · 訪問量 3813
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章