习题集:hot 100 (c++)
题目: 第二题 两数相加 (难度中等)
小白目前只能想到比较直接的方法:本题是采用不带头结点的单链表进行操作的(这里要注意!不然后续的进位计算会出错!!这是我最开始踩的坑)通过对链表中数据的观察,发现只需要维护一个进位变量,这里我采用的是bool型变量,当需要进位时置进位变量st为true,反之为false。由于链l1,l2链表的长度不一定完全相同,因此我分为了三种链表状态进行考虑,再根据进位变量的状态分别进行不同操作。
/**
* 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) {}
* };
*/
#define null 0
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* l3=new ListNode(); //用于储存求和后的数字
ListNode *sumNode;
ListNode *p1,*p2,*p3;
//ListNode *form1,*form2;
//ListNode *cur1,*cur2;
p3 = l3;
//采用头插法将量链表进行原地逆置
/*cur1 = l1;
l1 = null;
while(cur1!=null){
form1 = cur1;
cur1 = cur1->next;
form1->next = l1;
l1 = form1;
}
cur2 = l2;
l2 = null;
while(cur2!=null){
form2 = cur2;
cur2 = cur2->next;
form2->next = l2;
l2 = form2;
}*/
p1 = l1;p2 = l2;
bool st = false;
while(p1!=null||p2!=null){
if(p1!=null&&p2!=null){
int vec = p1->val+p2->val;
if(st==false){
if(vec<=9){
sumNode = new ListNode(vec);
p3->next = sumNode;
p3 = p3->next;
p2 = p2->next;
p1 = p1->next;
st = false;
}
else{
sumNode = new ListNode(vec%10);
p3->next = sumNode;
p3 = p3->next;
p2 = p2->next;
p1 = p1->next;
st=true;
}
}
else{
if(vec<9){
sumNode = new ListNode(vec+1);
p3->next = sumNode;
p3 = p3->next;
p2 = p2->next;
p1 = p1->next;
st = false;
}
else{
sumNode = new ListNode(vec-9);
p3->next = sumNode;
p3 = p3->next;
p2 = p2->next;
p1 = p1->next;
st = true;
}
}
}
else if(p1==null&&p2!=null){
int vec = p2->val;
if(st==false){
if(vec<=9){
sumNode = new ListNode(vec);
p3->next = sumNode;
p3 = p3->next;
p2 = p2->next;
st = false;
}
else{
sumNode = new ListNode(vec%10);
p3->next = sumNode;
p3 = p3->next;
p2 = p2->next;
st=true;
}
}
else{
if(vec<9){
sumNode = new ListNode(vec+1);
p3->next = sumNode;
p3 = p3->next;
p2 = p2->next;
st = false;
}
else{
sumNode = new ListNode(vec-9);
p3->next = sumNode;
p3 = p3->next;
p2 = p2->next;
st = true;
}
}
}
else if(p1!=null&&p2==null) { //当出现l1,L2长度不相同时
int vec = p1->val;
if(st==false){
if(vec<=9){
sumNode = new ListNode(vec);
p3->next = sumNode;
p3 = p3->next;
p1 = p1->next;
st = false;
}
else{
sumNode = new ListNode(vec%10);
p3->next = sumNode;
p3 = p3->next;
p1 = p1->next;
st=true;
}
}
else{
if(vec<9){
sumNode = new ListNode(vec+1);
p3->next = sumNode;
p3 = p3->next;
p1 = p1->next;
st = false;
}
else{
sumNode = new ListNode(vec-9);
p3->next = sumNode;
p3 = p3->next;
p1 = p1->next;
st = true;
}
}
}
}
if(st==true){//这里要注意在循环完成后要再次判断是否需要进位
sumNode = new ListNode(1);
p3->next = sumNode;
p3 = p3->next;
st = false;
}
if(st==false)
return l3->next;
return l3->next;
}
};
注释掉的部分是开始由于判断错误导致认为应该先逆序再进行进位计算,后来在提交代码时有一个算例无法通过,才发现问题。把这段注释掉的代码贴上来是想记录一下自己的错误hhh
代码的结构不复杂,但是性能不算很好,仍需要继续学习
路漫漫其修远兮