需要用到的变量
1.ListNode* head 链头
2.ListNode* tail 链尾
3.int count 用于判断两个节点的数相加是否超过10
4.int sum 两数相加的和,放进需要返回的链表里
代码看了官方题解,看明白了点又敲了一遍
代码
/**
* 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) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head=nullptr; //链表头
ListNode* tail=nullptr; //链表尾
int count=0; //用于判断两个表的节点相加是否超过10
while(l1||l2) //全部为nullptr则不再执行
{
int sum=0; //用于放两数之和
if(l1) //如果到了nullptr,不执行
{
sum+=l1->val; //把l1表里的节点数据域里的值放进sum
l1=l1->next; //l1指针前往下一个节点
}
if(l2) //如果到了nullptr,不执行
{
sum+=l2->val; //把l2表里的节点数据域里的值放进sum
l2=l2->next; //l2指针前往下一个节点
}
sum+=count; //第一次循环肯定是0,如果之后的节点相加超过10后,这个count会是1
if(!head) //链表头指针是否已经指向一个节点作为头指针
head=tail=new ListNode(sum%10); //没有则让指针指向一个新建的节点作为头指针,尾指针和头指针指向一个节点地址,新建的节点里的数据域是在10以内的,考虑到如果超过10,需要取余
else
{
tail->next=new ListNode(sum%10); //否则尾指针指向的节点里的next指针指向一个新建的节点
tail=tail->next; //尾指针前往新建的那个节点
}
count=sum/10; //count判断是否sum超过10
}
if(count>0) //循环结束后还有一次判断,万一最后的两个节点的值相加超过10却循环已经结束,无法执行循环体里的判断
tail->next=new ListNode(count); //新建节点然后next指针指向新建的节点
return head; //返回head指针
}
};
题目写着两数相加之和但不能从链表里取数字组成三位数字相加等,如果链表里数大了甚至会超出long的范围
麻了