1. 程式人生 > >兩數相加(c++實現)

兩數相加(c++實現)

這道題原來是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;
    }
};

實現思路:

先反轉兩個連結串列,然後將兩個連結串列對應位相加,將相加結果再次反轉即可得到題目要求的連結串列。