本文首發於公衆號「五分鐘學算法」,是圖解 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;
}
};
複製代碼