在 LeetCode 206——反轉鏈表 和 LeetCode 2——兩數相加 的基礎上,先對兩個鏈表進行反轉,而後求出和後再進行反轉便可。node
/** * 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) { // 先將兩個鏈表反序 l1 = reverseList(l1); l2 = reverseList(l2); ListNode *head = new ListNode(0); // 創建哨兵結點 ListNode *temp = head; int carry = 0; // 保留進位 int sum = 0; while(l1 || l2) { if (l1 && l2) // 兩個鏈表都非空 { sum = l1->val + l2->val + carry; l1 = l1->next; l2 = l2->next; } else if (l1) // l2 鏈表爲空,只對進位和 l1 元素求和 { sum = l1->val + carry; l1 = l1->next; } else // l1 鏈表爲空,只對進位和 l2 元素求和 { sum = l2->val + carry; l2 = l2->next; } // 求出和以及進位,將和添加到新鏈表中 carry = sum >= 10 ? 1 : 0; sum = sum % 10; head->next = new ListNode(sum); head = head->next; if ( (l1 == NULL || l2 == NULL) && carry == 0 ) { head->next = l1 ? l1 : l2; return reverseList(temp->next); } } if (carry) // 若最後一位還有進位,進位即爲最後一位的和 { head->next = new ListNode(carry); } head->next->next = NULL; return reverseList(temp->next); } ListNode* reverseList(ListNode* head) { if (head == NULL || head->next == NULL) return head; else { ListNode * p1 = head; ListNode * p2 = p1->next; ListNode * p3 = p2->next; while (p2) { p3 = p2->next; p2->next = p1; p1 = p2; p2 = p3; } head->next = NULL; head = p1; return head; } } };
先求出兩個鏈表的長度,而後對齊兩個鏈表,按照對應位分別求出每一位的和以及進位,最後從最低位也就是最右邊開始,將和與進位相加,新建節點在鏈表頭部插入便可。spa
例 1 | ||||
---|---|---|---|---|
l1 | 7 | 2 | 4 | 3 |
l2 | 5 | 6 | 4 | |
和 | 7 | 7 | 0 | 7 |
進位 | 0 | 1 | 0 | 0 |
結果 | 7 | 8 | 0 | 7 |
例 2 | ||||
---|---|---|---|---|
l1 | 9 | 9 | 9 | |
l2 | 9 | 9 | ||
和 | 0 | 9 | 8 | 8 |
進位 | 0 | 1 | 1 | 0 |
結果 | 1 | 0 | 9 | 8 |
class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { int n1 = countListNodeNumber(l1); int n2 = countListNodeNumber(l2); ListNode* long_list = NULL; ListNode* short_list = NULL; int bigger_n = 0; int smaller_n = 0; if (n1 <= n2) { long_list = l2; short_list = l1; bigger_n = n2; smaller_n = n1; } else { long_list = l1; short_list = l2; bigger_n = n1; smaller_n = n2; } int temp = bigger_n - smaller_n + 1; int sum_array[bigger_n + 1] = {0}; int carry_array[bigger_n + 1] = {0}; int sum = 0; int carry = 0; ListNode* long_temp = long_list; ListNode* short_temp = short_list; for (unsigned int i = 1; i <= bigger_n; i++) { carry = 0; if (i < temp) { sum = long_temp->val; } else { sum = long_temp->val + short_temp->val; if (sum >= 10) { sum = sum % 10; carry = 1; } short_temp = short_temp->next; } sum_array[i] = sum; carry_array[i-1] = carry; long_temp = long_temp->next; } ListNode* new_head = new ListNode(0); long_temp = new_head; for (unsigned int i = bigger_n; i > 0; i--) { // 在鏈表頭部進行插入 sum = sum_array[i] + carry_array[i]; if (sum >= 10) { sum = sum % 10; carry_array[i-1] = 1; } short_temp = new ListNode(sum); short_temp->next = long_temp->next; long_temp->next = short_temp; } sum = sum_array[0] + carry_array[0]; if (sum) { short_temp = new ListNode(sum); short_temp->next = long_temp->next; long_temp->next = short_temp; } return new_head->next; } int countListNodeNumber(ListNode *head) { int node_num = 0; ListNode* slow = head; ListNode* fast = head; while(fast && fast->next) { slow = slow->next; fast = fast->next->next; node_num++; } if (fast) { node_num = node_num * 2 + 1; } else { node_num = node_num * 2; } return node_num; } };
將兩個鏈表的節點分別放入兩個棧中,若兩個棧都非空,拿兩個棧頂元素和進位,求出和以及新的進位;若其中一個棧爲空,則拿一個棧頂元素和進位,求出和以及新的進位。而後新建節點,在鏈表頭部進行插入,最後只用處理一下最高位的進位便可。.net
class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { stack<ListNode *> stack1; stack<ListNode *> stack2; while (l1) { stack1.push(l1); l1 = l1->next; } while (l2) { stack2.push(l2); l2 = l2->next; } int sum = 0; int carry = 0; ListNode *new_head = new ListNode(0); ListNode *temp = NULL; while (!stack1.empty() && !stack2.empty()) { sum = stack1.top()->val + stack2.top()->val + carry; if (sum >= 10) { sum = sum % 10; carry = 1; } else carry = 0; temp = new ListNode(sum); temp->next = new_head->next; new_head->next = temp; stack1.pop(); stack2.pop(); } while (!stack1.empty()) { sum = stack1.top()->val + carry; if (sum >= 10) { sum = sum % 10; carry = 1; } else carry = 0; temp = new ListNode(sum); temp->next = new_head->next; new_head->next = temp; stack1.pop(); } while (!stack2.empty()) { sum = stack2.top()->val + carry; if (sum >= 10) { sum = sum % 10; carry = 1; } else carry = 0; temp = new ListNode(sum); temp->next = new_head->next; new_head->next = temp; stack2.pop(); } if (carry) { temp = new ListNode(carry); temp->next = new_head->next; new_head->next = temp; } return new_head->next; } };
獲取更多精彩,請關注「seniusen」! code