LeetCode 第 2 號問題:兩數相加

本文首發於公衆號「五分鐘學算法」,是圖解 LeetCode 系列文章之一。git

我的網站:www.cxyxiaowu.comgithub

題目來源於 LeetCode 上第 2 號問題:兩數相加。題目難度爲 Medium,目前經過率爲 33.9% 。算法

題目描述

給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,而且它們的每一個節點只能存儲 一位 數字。bash

若是,咱們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。動畫

您能夠假設除了數字 0 以外,這兩個數都不會以 0 開頭。網站

示例:ui

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
緣由:342 + 465 = 807
複製代碼

題目解析

設立一個表示進位的變量carried,創建一個新鏈表,把輸入的兩個鏈表從頭日後同時處理,每兩個相加,將結果加上carried後的值做爲一個新節點到新鏈表後面。spa

動畫描述

代碼實現

/// 時間複雜度: O(n)
/// 空間複雜度: O(n)
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {

        ListNode *p1 = l1, *p2 = l2;
        ListNode *dummyHead = new ListNode(-1);
        ListNode* cur = dummyHead;
        int carried = 0;
        while(p1 || p2 ){
            int a = p1 ? p1->val : 0;
            int b = p2 ? p2->val : 0;
            cur->next = new ListNode((a + b + carried) % 10);
            carried = (a + b + carried) / 10;

            cur = cur->next;
            p1 = p1 ? p1->next : NULL;
            p2 = p2 ? p2->next : NULL;
        }

        cur->next = carried ? new ListNode(1) : NULL;
        ListNode* ret = dummyHead->next;
        delete dummyHead;
        return ret;
    }
};

複製代碼

相關文章
相關標籤/搜索