1. 程式人生 > 實用技巧 >連結串列題目彙總

連結串列題目彙總

167.連結串列求和

你有兩個用連結串列代表的整數,其中每個節點包含一個數字。數字儲存按照在原來整數中相反的順序,使得第一個數字位於連結串列的開頭。寫出一個函式將兩個整數相加,用連結串列形式返回和。

樣例

樣例 1:

輸入: 7->1->6->null, 5->9->2->null
輸出: 2->1->9->null	
樣例解釋: 617 + 295 = 912, 912 轉換成連結串列:  2->1->9->null

樣例 2:

輸入:  3->1->5->null, 5->9->2->null
輸出: 8->0->8->null	
樣例解釋: 513 + 295 = 808, 808 轉換成連結串列: 8->0->8->null


對題目理解不好,資料型別換成long 解答:通過70%

class Solution {
public:
/**
* @param l1: the first list
* @param l2: the second list
* @return: the sum list of l1 and l2 
*/
ListNode * addLists(ListNode * l1, ListNode * l2) {
// write your code here
stack<int> res1,res2;

if(l1==NULL ){
return l2;
}

if(l2==NULL){
return l1;
}

while(l1!=NULL){

res1.push(l1->val);
l1=l1->next;

}

while(l2!=NULL){

res2.push(l2->val);
l2=l2->next;
}

int len1=res1.size();
int len2=res2.size();

int num1 = 0;
while(len1--){
int temp1=res1.top()*pow(10,len1);
res1.pop();

num1 = num1+temp1;

}

int num2 = 0;
while(len2--){
int temp2=res2.top()*pow(10,len2);
res2.pop();

num2 = num2+temp2;

}

int num = num1+num2;


cout<<num<<endl;
vector<int> result;

while(num>=10){
int temp = num%10;
result.push_back(temp);

num=num/10;

}

result.push_back(num);

int l = result.size();
cout<<l<<endl;

ListNode* head = new ListNode(result[0]);

ListNode * temp =head;
for(int i=1;i<l;i++){

ListNode* node = new ListNode(result[i]);
cout<<node->val<<endl;
temp->next=node;
temp = node;
}

 

return head;

}
};

  

優秀解法:

/**
 * Definition of singly-linked-list:
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *        this->val = val;
 *        this->next = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
    * @param l1: the first list
    * @param l2: the second list
    * @return: the sum list of l1 and l2
    */
    ListNode *addLists(ListNode *l1, ListNode *l2) {
        // write your code here
        ListNode *head = new ListNode(0);
        ListNode *end = head;
        ListNode *curr1 = l1;
        ListNode *curr2 = l2;
        int carry = 0;
        // 深入理解題目,求和進位進到後面去了,所以從前往後遍歷就行
        while (curr1 != nullptr || curr2 != nullptr || carry != 0)
        {
            int a1 = 0;
            int a2 = 0;
            if (curr1 != nullptr)
            {
                a1 = curr1->val;
                curr1 = curr1->next;
            }
            if (curr2 != nullptr)
            {
                a2 = curr2->val;
                curr2 = curr2->next;
            }
            int sum = a1 + a2 + carry;
            carry = sum / 10;
            sum %= 10;
            ListNode *curr = new ListNode(sum);
            end->next = curr;
            end = curr;
        }
        return head->next;
    }
};