冲冲冲
题目要注意的点
1.l1和l2这俩链表的长度可能不相等。如果l1比l2长3个节点,那l2少的这3个节点就要设为0。
2.观察示例可知,将对应节点依次相加,然后往右进位即可。
/**
* 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, *tail = nullptr; //建立新链表的头尾部节点为nullptr
int carry = 0; //进位数
while(l1 || l2) //如果l1,l2中有一个没有走到尾结点(长度可能不相等),即当前节点->next非空,继续
{
int add1 = l1? l1->val:0; //如果l1,l2头节点非空,将节点的值赋给add1,add2,否则赋0
int add2 = l2? l2->val:0;
int temp = add1 + add2 + carry; //记录l1,l2对应节点相加的值,记得进位数。
carry = temp / 10; //判断节点相加的值是否大于10,如果是则进位数置为1。
if(!head)
{
head = tail = new ListNode(temp%10);//这是新链表的第一个数,此时头节点=尾节点
}
else
{
tail->next = new ListNode(temp%10); //在非空链表中新增一个节点,原来的尾结点指向新增节点
tail = tail->next; //更新尾结点
}
if(l1) //如果当前l1,l2非空,则递增到下一节点
l1 = l1->next; //注意,这里的两个if判断是必须的,因为l1和l2长度可能不等。l1较长时,l2缺失的那些节点置为0.
if(l2)
l2 = l2->next;
}
if(carry>0) //如果尾节点相加大于10,说明要新增一位,值为1。
{
tail->next = new ListNode(1);
tail = tail -> next;
}
return head; //返回新链表的头结点。
}
};