注意事项:
- 不能直接两个链表取出来数字算,因为有可能数字过大,long long也不行,所以就得一位一位挨着算。
- 这里用
vector<int>
存链表里的数字。 - 因为涉及到进位的情况,所以我将两个初始数字 倒着循环 。
c++版本
class Solution {
public:
ListNode* addInList(ListNode* head1, ListNode* head2) {
// write code here
vector<int> num1, num2;
int i, single_sum;
if(!head1) return head2; //有一个为空直接 return 另一个
if(!head2) return head1;
while(head1){ //分别将两个链表的数字取出来放在vector中
num1.emplace_back(head1->val);
head1 = head1->next;
}
while(head2){
num2.emplace_back(head2->val);
head2 = head2->next;
}
vector<int> sum_num;
bool tag=false; //设置一个tag,如果需要进位就改成true,不需要进位就改成false
//倒着循环 num1 和 num2
for(vector<int>::iterator n1=num1.end()-1, n2=num2.end()-1;n1!=num1.begin()-1 || n2!=num2.begin()-1;){
if(n1!=num1.begin()-1 && n2!=num2.begin()-1){ //如果两个都没到开头,两者相加即可
single_sum = *n1 + *n2;
n1--; n2--;
}else if(n1 == num1.begin()-1){ //如果有一个到开头了,只需要取另一个的值即可
single_sum = *n2;
n2--;
}else if(n2 == num2.begin()-1){
single_sum = *n1;
n1--;
}
if(tag) single_sum+=1; //上一次进位了,当前数字要+1
if(single_sum >= 10){ //判断是否需要进位
single_sum = single_sum % 10;
tag = true;
}else{
tag = false;
}
sum_num.emplace_back(single_sum);
}
ListNode* res = (ListNode*)malloc(sizeof(ListNode*)); //头插法
res->next = NULL;
for(i=0; i<sum_num.size(); i++){
ListNode* temp = (ListNode*)malloc(sizeof(ListNode*));
temp->val = sum_num[i];
temp->next = res->next;
res->next = temp;
}
return res->next;
}
};
c++用的不熟,代码比较冗长,但是写的都比较简单。
python版本
- 将两个链表用字符串提出来
- 然后转int直接相加(相比于c++省了大数相加的部分)
- 计算出两数之和后,循环生成新链表即可。
#
class Solution:
def addInList(self , head1: ListNode, head2: ListNode) -> ListNode:
# write code here
num1 = num2 = ''
while head1:
num1 += str(head1.val)
head1 = head1.next
while head2:
num2 += str(head2.val)
head2 = head2.next
sum_num = str(int(num1) + int(num2))
res = head = ListNode(int(sum_num[0]))
for i in range(1, len(sum_num)):
temp = ListNode(int(sum_num[i]))
head.next = temp
head = head.next
return res