本题需要熟练掌握数据结构——链表。我做了好久,刚刚ac。其实大体上的代码逻辑我很快就想好了,但因为细节问题耽误了很多时间。我总结原因有两点,其一是对代码的掌握能力较差,缺少全局观,其二是粗心大意。方法比较笨,先记录下来,以后再做优化。
本题思路:定义一个保存进位数的数组,同时观察到链表节点都是个位数,即要么进 0,要么进 1 。然后用if else 语句分情况讨论。思路不难,难在细节。
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
vector<int> jinwei; //保存每次进位的进位数
jinwei.push_back(0);
vector<int> result;
int j = 0, l = 0, i1, i2, i3, i4;
int l1_val, l2_val;
// l1_val = l1->val; l2_val = l2->val;
while (l1 != NULL || l2 != NULL)
{
if(l1) l1_val = l1->val;
if(l2) l2_val = l2->val;
if (l1_val + l2_val + jinwei.at(l) < 10 && l1 != NULL && l2 != NULL)
{
j = 1;
l = l + 1;
}
else if (l1_val + l2_val + jinwei.at(l) >= 10 && l1 != NULL && l2 != NULL)
{
j = 2;
l = l + 1;
}
else if (l1 != NULL && l2 == NULL)
{
j = 3;
l = l + 1;
}
else if (l1 == NULL && l2 != NULL)
{
j = 4;
l = l + 1;
}
switch (j)
{
case 1:
i1 = (l1_val + l2_val + jinwei.at(l - 1));
jinwei.push_back(0); //只能进1
result.push_back(i1);
break;
case 2:
i2 = (l1_val + l2_val + jinwei.at(l - 1) )% 10; //l - 1!
jinwei.push_back(1);
result.push_back(i2);
break;
case 3:
i3 = l1_val + jinwei.at(l - 1);
if(i3 >= 10)
{
i3 = (l1_val + jinwei.at(l - 1)) % 10;
jinwei.push_back(1);
result.push_back(i3);
}
else
{
jinwei.push_back(0);
result.push_back(i3);
}
break;
case 4:
i4 = l2_val + jinwei.at(l - 1);
if(i4 >= 10)
{
i4 = (l2_val + jinwei.at(l - 1)) % 10;
jinwei.push_back(1);
result.push_back(i4);
}
else
{
jinwei.push_back(0);
result.push_back(i4);
}
break;
}
if (l1) l1 = l1->next;
if (l2) l2 = l2->next;
}
if(jinwei.at(jinwei.size() - 1) != 0)
result.push_back(jinwei.at(jinwei.size() - 1));
return creat(result);
}
ListNode* creat(vector<int> v)
{
ListNode* P = new ListNode(v[0]);
ListNode* T = P;
int j = v.size();
for (int i = 1; i < j; i++)
{
ListNode* L = new ListNode(v[i]);
T->next = L;
T = T->next;
}
return P;
}
};
再来说说我写题时遇到的坎儿吧。1. while的循环条件 2.vector<int> jinwei 下标的移动 3.case 3, case 4 考虑情况不全
方法比较笨,以后再看时我会做优化。