大家好,我是一只学弱狗,记录学习的点点滴滴!
算法才是程序设计的灵魂,每日一题!
优质文章
优质专栏
刚看到的时候觉得挺难的,因为数据结构忘光了,但是通过不断的尝试,发现其实挺简单的,我大概说下思路吧
首先如果你会求解两个整数相加,那么这道题你就已经成功了一多办了,什么?两个整数相加?这不分分中,哈哈哈,其实我的意思是两个超级长的整数相加,意味着,你是用long long 类型也是保存不下的,那么这该怎么做呢?我们可以使用两个字符串来代表这两个超级长的数,然后将它们反转,即低位对齐,然后进行各位相加和进位,待结束后再将字符串反转,即为两树的和,下面是这部分代码的实现
string strAdd(string a,string b){
string result="";
int len = min(a.length(),b.length());
int jinwei = 0;
int i;
for(i=0;i<len;i++){
int temp = charToInt(a[i])+charToInt(b[i])+jinwei;
result.push_back(intToChar(temp%10));
jinwei = temp/10;
}
while(i<a.length()){
int temp = charToInt(a[i])+jinwei;
result.push_back(intToChar(temp%10));
jinwei = temp/10;
i++;
}
while(i<b.length()){
int temp = charToInt(b[i])+jinwei;
result.push_back(intToChar(temp%10));
jinwei = temp/10;
i++;
}
if(jinwei!=0){
result.push_back(intToChar(jinwei));
}
return result;
}
这里面用到了两个小函数、int到char,char到int,还是很好用的,下面是它们的实现,如果大家有好的API可以留言,感激不尽!
int charToInt(char c){
return c-'0';
}
char intToChar(int i){
return '0'+i;
}
如果你会求解上面这个问题的话,你会发现这题考的不就是这么?你都不需要反转,因为链表自己就是反的,也就是说,你只需要读取链表中的各个值,拼成字符串,然后两个字符串相加,将得到的结果转为一个单链表就完事了,怎么样,是不是很简单,你快去试试吧!
下面附上我的devcpp的代码,因为刚开始遇到了不少问题,网页里面执行起来真的慢!
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
//string reverse(string str){
// if(str.length()==1) return str;
// return str[str.length()-1]+reverse(str.substr(0,str.length()-1));
//}
int charToInt(char c){
return c-'0';
}
char intToChar(int i){
return '0'+i;
}
ListNode* createListNode(string num){
int len = num.length();
if(len>0){
ListNode* head = new ListNode(charToInt(num[0]));
ListNode* front = head;
ListNode * tmp = NULL;
for(int i=1;i<len;i++){
tmp = new ListNode(charToInt(num[i]));
front->next = tmp;
front = tmp;
}
return head;
}
return NULL;
}
string strAdd(string a,string b){
string result="";
int len = min(a.length(),b.length());
int jinwei = 0;
int i;
for(i=0;i<len;i++){
int temp = charToInt(a[i])+charToInt(b[i])+jinwei;
result.push_back(intToChar(temp%10));
jinwei = temp/10;
}
while(i<a.length()){
int temp = charToInt(a[i])+jinwei;
result.push_back(intToChar(temp%10));
jinwei = temp/10;
i++;
}
while(i<b.length()){
int temp = charToInt(b[i])+jinwei;
result.push_back(intToChar(temp%10));
jinwei = temp/10;
i++;
}
if(jinwei!=0){
result.push_back(intToChar(jinwei));
}
return result;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
stringstream ss;
string s1 = "",s2 = "";
while(l1!=NULL){
s1.push_back(intToChar(l1->val));
l1 = l1->next;
}
while(l2!=NULL){
s2.push_back(intToChar(l2->val));
l2 = l2->next;
}
string result = strAdd(s1,s2);
return createListNode(result);
}
int main(){
ListNode* l1 = createListNode("1000000000000000000000000000001");
ListNode* l2 = createListNode("564");
ListNode* result = addTwoNumbers(l1,l2);
while(result!=NULL){
cout<<result->val;
result = result->next;
}
return 1;
}
下面是提交给力扣的代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
stringstream ss;
string s1 = "",s2 = "";
while(l1!=NULL){
s1.push_back(intToChar(l1->val));
l1 = l1->next;
}
while(l2!=NULL){
s2.push_back(intToChar(l2->val));
l2 = l2->next;
}
string result = strAdd(s1,s2);
return createListNode(result);
}
int charToInt(char c){
return c-'0';
}
char intToChar(int i){
return '0'+i;
}
string reverse(string str){
if(str.length()==1) return str;
return str[str.length()-1]+reverse(str.substr(0,str.length()-1));
}
ListNode* createListNode(string num){
int len = num.length();
if(len>0){
ListNode* head = new ListNode(charToInt(num[0]));
ListNode* front = head;
ListNode * tmp = NULL;
for(int i=1;i<len;i++){
tmp = new ListNode(charToInt(num[i]));
front->next = tmp;
front = tmp;
}
return head;
}
return NULL;
}
string strAdd(string a,string b){
string result="";
int len = min(a.length(),b.length());
int jinwei = 0;
int i;
for(i=0;i<len;i++){
int temp = charToInt(a[i])+charToInt(b[i])+jinwei;
result.push_back(intToChar(temp%10));
jinwei = temp/10;
}
while(i<a.length()){
int temp = charToInt(a[i])+jinwei;
result.push_back(intToChar(temp%10));
jinwei = temp/10;
i++;
}
while(i<b.length()){
int temp = charToInt(b[i])+jinwei;
result.push_back(intToChar(temp%10));
jinwei = temp/10;
i++;
}
if(jinwei!=0){
result.push_back(intToChar(jinwei));
}
return result;
}
};