本篇文章记录在leetcode中LinkedList主题下面的题目和自己的思考以及优化过程,具体内容层次按照{题目,分析,初解,初解结果,优化解,优化解结果,反思}的格式来记录,供日后复习和反思[注:有些题目的解法比较单一,就没有优化过程]。题目的顺序按照leetcode给出的题目顺序,有些题目在并不是按照题目本身序号顺序排列的,也不是严格按照难易程度来排列的。
因此,这篇文章并不具有很强的归类总结性,归类总结性知识将会在其他文章记录,本篇重点在记录解题过程中的思路,希望能对自己有所启发。
/**
* 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* head = nullptr;
ListNode** ptr = &head;//重点在此,必须使用指针的指针,如果使用单纯的指针则无法改变head的内容,如果使用引用则使得最终head指向链表末尾
ListNode* a = l1;
ListNode* b = l2;
int carry = 0;
while(a!=nullptr || b!=nullptr)
{
int sum = 0;
if(a!=nullptr && b!=nullptr)
{
sum = a->val + b->val + carry;
a = a->next;
b = b->next;
}
else if(a!=nullptr)
{
sum = a->val + carry;
a = a->next;
}
else
{
sum = b->val + carry;
b = b->next;
}
carry = (sum >= 10)? 1:0;
int mod = sum - carry * 10;
ListNode* next = new ListNode(mod);
*ptr=next;
ptr =&(next->next);
}
if(carry != 0)
{
ListNode* next = new ListNode(carry);
*ptr= next;
ptr=&(next->next);
}
return head;
}
};