给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7
思路:
加法是从低位加起的,所以对于链表来说,每次都要到最后一个节点,如果每次都索引到最后一个节点就太浪费时间了。既然是逆序操作,第一个想到的就应该是栈。栈是逆序的大杀器。好,逆序问题解决了。
加法是有进位的,所以我们在两个数相加后存储进位,int count=sum/10;原位置int tmp=a%10;(%防止了分情况讨论,有没有进位都可以取余)。
好了,剩下就是新链表的构造了,不多说了,反转链表能完成的话,链表就基本没问题了。
代码:
/**
* 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) {
stack<int> sta1,sta2;
while(l1)
{
sta1.push(l1->val);
l1=l1->next;
}
while(l2)
{
sta2.push(l2->val);
l2=l2->next;
}
int count=0;
ListNode* pHead=nullptr;
while(!sta1.empty()||!sta2.empty()||count)//注意此处count也应该是一个依据,当1、2都空但是count进位时,此时还需要一个节点来存最高位的这个进位数
{
int a=sta1.empty()?0:sta1.top();
int b=sta2.empty()?0:sta2.top();
if(!sta1.empty())
sta1.pop();
if(!sta2.empty())
sta2.pop();
int tmp=a+b+count;
count=tmp/10;
tmp%=10;
auto pNext=new ListNode(tmp);//创建一个tmp值的节点
pNext->next=pHead;//加到phead前方
pHead=pNext;//phead前移
}
return pHead;
}
};
链表是一个常考点,顺便回忆一下反转吧。
void ReverseList(ListNode* phead)
{
if(phead==nullptr||phead->next==nullptr)
return phead;
ListNode* pre=nullptr;//存放上一个节点
ListNode* cur=head;//存放现在的节点
ListNode* head=nullptr;
while(cur)
{
ListNode* pNext=cur->next;
if(pNext==nullptr)
head=cur;//反转后的头节点
cur->next=pre;
pre=cur;
cur=pNext;
}
return head;
}
over!晚安!