2. 两数相加(C++)[中等]
程序员文章站
2022-03-09 10:21:06
...
题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
方法1:
基本思路:
这个方法较为简单,也是比较被认可的一个方法,中间有创建新的链表。
其中比较精彩的地方是两数相加进位的部分,值得学习。
/**
* 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) {
ListNode* node = new ListNode(0);
ListNode* p1 = l1;
ListNode* p2 = l2;
ListNode* curr = node;
int carry = 0;
while(p1!=NULL || p2!=NULL){
int x = (p1!=NULL) ? p1->val:0;
int y = (p2!=NULL) ? p2->val:0;
int sum = carry + x + y; //x,y加上当前进位
carry = sum/10; //进位
curr->next = new ListNode(sum%10);
curr = curr->next;
if(p1!=NULL) p1 = p1->next;
if(p2!=NULL) p2 = p2->next;
}
if(carry > 0)
curr->next = new ListNode(carry);
return node->next;
}
};
方法:2:
基本思路:
[这是我最最开始的想法,虽然较为复杂,但是对于的复杂度还是挺可观的,中间没有创建新的链表]:
l1,l2 以其一较长的链表为最终返回的链表,进行加法运算,逢10加1,加到最短的链表结束为止,判断较长的链表的下一位是否>=10,和如果>=10,它又是否有下一位,没有的话创建新的节点加上去,再加1。
/**
* 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) {
ListNode* p1;
ListNode* p2;
int i =0,count1 = 0,count2 = 0,max=0;
p1 = l1;
p2= l2;
while(p1!=NULL){
count1++;
p1 = p1->next;
}
while(p2!=NULL){
count2++;
p2 = p2->next;
}
p1 =l1;
p2= l2;
if(count1 >= count2){
while(p1 != NULL && p2!= NULL){
p1->val +=p2->val;
if((p1->val) >=10){
if(p1->next!=NULL){
p1->val -=10;
p1->next -> val ++;
}else {
ListNode* newNode = new ListNode(0);
p1->val -=10;
newNode->val = 0;
p1->next = newNode;
p1 = newNode;
p1->val++;
newNode->next = NULL;
}
}
p1 =p1->next;
p2 = p2->next;
}
if(p1!= NULL)
while(p1->val >=10 && p1!= NULL){
if(p1->next!=NULL){
p1->val -=10;
p1->next->val++;
p1 = p1->next;
}else{
ListNode* newNode = new ListNode(0);
p1->val -=10;
newNode->val = 0;
p1->next = newNode;
p1 = newNode;
p1->val++;
newNode->next = NULL;
}
}
return l1;
}else{
while(p1 != NULL && p2!= NULL){
p2->val +=p1->val;
if((p2->val) >=10){
if(p2->next!=NULL){
p2->next -> val ++;
p2->val -=10;
}else{
ListNode* newNode = new ListNode(0);
p2->val -=10;
newNode->val = 0;
p2->next = newNode;
p2 = newNode;
p2->val++;
newNode->next = NULL;
}
}
p1 =p1->next;
p2 = p2->next;
}
if(p2!= NULL)
while(p2->val >=10 && p2!= NULL){
if(p2->next!=NULL){
p2->val -=10;
p2->next->val++;
p2 = p2->next;
}else{
ListNode* newNode = new ListNode(0);
p2->val -=10;
p2->next = newNode;
p2 = newNode;
p2->val++;
newNode->next = NULL;
}
}
return l2;
}
}
};
很少写博客,如果出入,恳请指教 - -
上一篇: leetcode刷题
下一篇: javascript常用的系统函数有哪些