同步发于 JuzerTech 网站,里面有我软、硬件学习的纪录与科技产品开箱,欢迎进去观看。
题目为给定两个链表 ( Link List ),进行加法,回传他们计算后的值(同样以链表 ( Link List ) 回传),数字由左而右依序进位。
题目如下
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Example 1:
Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]
Explanation: 342 + 465 = 807.
Example 2:
Input: l1 = [0], l2 = [0]
Output: [0]
Example 3:
Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
Output: [8,9,9,9,0,0,0,1]
我采用的策略为,在较长的链表 ( Link List )进行计算,结束后直接回传该链表 ( Link List ),以减少内存 ( memory ) 的使用量。
代码如下所示
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *mainptr, *optr, *run;
int carry = 0;
if( CountList(l1) > CountList(l2) ){
mainptr = l1;
optr = l2;
}
else{
mainptr = l2;
optr = l1;
}
run = mainptr;
while(optr != NULL || carry!=0){
if(optr != NULL){
carry += optr->val;
optr = optr->next;
}
if(run != NULL){
carry += run->val;
run->val = carry % 10;
if(run->next != NULL){
run = run->next;
}
else{
if(carry / 10){
run->next = new ListNode(carry/10);
run = run->next;
return mainptr;
}
}
}
carry = carry / 10;
}
return mainptr;
}
private:
int CountList(ListNode *input){
ListNode *temp = input;
int counter = 0;
while(temp!=NULL){
counter ++;
temp = temp->next;
}
return counter;
}
};