LeetCode之两数相加:
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers
根据题目我们可以分析其用到数据结构的链表其他的具体的知识点就暂时想不起来了主要是一系列的逻辑的判断。其中主要的为三个选择判断分别是当l1和l2都不为空时,l1为空l2不为空,l2为空l1不为空,在这三种情况下分别进行分析,其中还要考虑到进位的情况。(注意由于这是程序的一个函数且不是主函数,因此返回值要不可以使用在当前函数定义的局部变量。)
/**
* 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) {
if (l1 == nullptr&&l2 == nullptr)
{
return nullptr;
}
/*使用两个新的指针便于在最后返回时使用l1或者l2的头结点*/
ListNode *temp1 = l1;
ListNode *temp2 = l2;
int temp = 0;//定义一个零时变量用来判断是否进位
ListNode *listNode = new ListNode(0);
ListNode *templist = listNode;
while (temp1 || temp2)
{
if (temp1&&temp2)//当temp1和temp2都不为空
{
if ((temp1->val + temp2->val + temp) < 10)
{
ListNode *newNode = new ListNode(temp1->val + temp2->val + temp);//使用构造函数赋值效率较高。
temp = 0;
temp1 = temp1->next;
temp2 = temp2->next;
listNode->next = newNode;
listNode = listNode->next;
}
else
{
ListNode *newNode = new ListNode(temp1->val + temp2->val - 10 + temp);
temp = 1;//如果其值大于10将temp标记为1便于进位。
temp1 = temp1->next;
temp2 = temp2->next;
listNode->next = newNode;
listNode = listNode->next;
}
}
if ((temp1==nullptr)&&(temp2!=nullptr))//当temp1为nullptr但是temp2还不为nullptr时
{
if (( temp2->val+temp) < 10)
{
ListNode *newNode = new ListNode( temp2->val + temp);
temp = 0;
temp2 = temp2->next;
listNode->next = newNode;
listNode = listNode->next;
}
else
{
ListNode *newNode = new ListNode(temp2->val - 10 + temp);
temp = 1;
temp2 = temp2->next;
listNode->next = newNode;
listNode = listNode->next;
}
}
if ((temp1 != nullptr) && (temp2 == nullptr))//当temp2为nullptr但是temp1还不为nullptr时
{
if ((temp1->val+temp) < 10)
{
ListNode *newNode = new ListNode(temp1->val + temp);
temp = 0;
temp1 = temp1->next;
listNode->next = newNode;
listNode = listNode->next;
}
else
{
ListNode *newNode = new ListNode(temp1->val - 10 + temp);
temp = 1;
temp1 = temp1->next;
listNode->next = newNode;
listNode = listNode->next;
}
}
}
if (temp != 0)//最后进行判断链表中的最后一项是否还存在着进位的状态如果存在则在进行下面的
{
ListNode *newNode = new ListNode(temp);
listNode->next = newNode;
listNode = listNode->next;
}
return templist->next;//因为第一项用来默认初始化了所以从第一项的next开始返回
}
};