此題Leetcode Add Two Numbers的問題如下所示,輸入有2個鏈結串列,鏈結串列中每個鏈結單元代表一個位數,因此需要將相同位數的數值進行加總,若有進位值,則需與下個位數之兩個鏈結單元值進行相加,以下為例,2+5=7、4+6=10、3+4=7,4+6=10需進位,且該位數=0,因此,輸出結果為708。
Example:
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807
作法解析:此題須使用鏈結串列進行相加,第一個while迴圈判斷是否兩鏈結串列皆不是空的,是則進行相加,第二個while迴圈則是判斷是否為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 *l3 = new ListNode(0); //宣告回傳列節串列 ListNode *p = l1, *q = l2, *r = l3; //宣告鏈結串列指標 int carry = 0, sum = 0; //宣告加總以及進位暫存 while(p != NULL && q != NULL) //若兩鏈結串列皆有值 { sum = p->val + q->val + carry; //算出兩個位數以及進位之總和 carry = sum / 10; //算出進位數 r->next = new ListNode(sum % 10); //創立該位數之節點 p = p->next; //移動指標 q = q->next; r = r->next; } while(p != NULL || q != NULL || carry != 0) //若還有一個鏈結串列有值以及還有進位 { sum = carry; if (p != NULL) //若l1不是空的 { sum += p->val; p = p->next; } if (q != NULL) //若l2不是空的 { sum += q->val; q = q->next; } carry = sum / 10; //計算進位 r->next = new ListNode(sum % 10); //創立節點 r = r->next; } return l3->next; } };
程式解析:
1.p->val 為鏈結串列取值。
2.p = p->next 為鏈結串列指向下一個。
3.r = new ListNode(sum % 10) 為創立節點。
4.while(p != NULL && q != NULL) 判斷兩節點是否為空節點。
5.while(p != NULL || q != NULL || carry != 0) 只有單一連結串列有值或是只剩下進位值。
文章標籤
全站熱搜