1. 程式人生 > >【LeetCode】445. 兩數相加 II

【LeetCode】445. 兩數相加 II

題目描述

給定兩個非空連結串列來代表兩個非負整數。數字最高位位於連結串列開始位置。它們的每個節點只儲存單個數字。將這兩數相加會返回一個新的連結串列。

你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。

進階: 如果輸入連結串列不能修改該如何處理?換句話說,你不能對列表中的節點進行翻轉。

示例

輸入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出: 7 -> 8 -> 0 -> 7

解決方法

分三步:(1)將連結串列中的數字轉化成字串形式 (2)兩個字串相加 (3)將相加的結果放入連結串列中

/**
 * 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) { //分三步:(1)將連結串列中的數字轉化成字串形式 (2)兩個字串相加 (3)將相加的結果放入連結串列中 string num1,num2;//(1)將連結串列中的數字轉化成字串形式 while(l1){ num1+=(l1->val+'0'); l1=l1->next; } while
(l2){ num2+=(l2->val+'0'); l2=l2->next; } string result=addStrings(num1,num2);//(2)兩個字串相加 ListNode *head=new ListNode(0);//(3)將相加的結果放入連結串列中 ListNode *tail=head; for (int i=0;i<result.size();i++){ tail=tail->
next=new ListNode(0); tail->val=(result[i]-'0'); } return head->next; } private: string addStrings(string num1, string num2) { // 415. 字串相加 string a=num1,b=num2; int len=max(a.size(),b.size());//補零 if (a.size()<len){ int temp=len-a.size(); while(temp--){ a+='0'; for (int i=a.size()-1;i>=1;i--) a[i]=a[i-1]; a[0]='0'; } } if (b.size()<len){ int temp=len-b.size(); while(temp--){ b+='0'; for (int i=b.size()-1;i>=1;i--) b[i]=b[i-1]; b[0]='0'; } } int add=0;//進位 string result(len,'0'); for (int i=len-1;i>=0;i--){ int temp=(a[i]-'0')+(b[i]-'0'); result[i]=add+temp%10+'0'; add=(result[i]-'0')/10+temp/10; result[i]=(result[i]-'0')%10+'0'; } if (add==1){ result+='0'; for (int i=result.size()-1;i>=1;i--) result[i]=result[i-1]; result[0]='1'; } return result; } };