兩數相加(c++實現)
阿新 • • 發佈:2019-02-19
這道題原來是leetcode上的兩數相加,資料結構老師把他換了一下,換成空間複雜度為O(1),時間複雜度為O(m+n).
題目要求如下:
用單鏈表表示整數,例如:整數12345可表示為:1→2→3→4→5。試設計演算法,通過對單鏈表的操作,實現兩個整數的加法運算運算結果依然用單鏈表表示。要求演算法的時間、空間複雜度分別為O(m+n)和O(1),其中m、n為表示兩個整數的單鏈表的長度。
程式碼實現:
/** * 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* a = reverse(l1); ListNode* b = reverse(l2); int carry = 0; int sum = 0; ListNode* p = a; ListNode* q = b; ListNode* r = new ListNode(0); ListNode* s = r; while(p&&q) { sum = p->val+q->val+carry; carry = sum/10; ListNode* temp = new ListNode(0); temp->val = sum % 10; r->next = temp; r = r->next; p = p->next; q = q->next; } while(p) { r->next = p; p = p->next; r = r->next; } while(q) { r->next = q; q = q->next; r = r->next; } return reverse(s->next); } ListNode* reverse(ListNode* head) { ListNode* p = head; ListNode* q = p->next; ListNode* r; p->next = NULL; while(q!=NULL) { r = q->next; q->next = p; p = q; q = r; } return p; } };
實現思路:
先反轉兩個連結串列,然後將兩個連結串列對應位相加,將相加結果再次反轉即可得到題目要求的連結串列。