题目:反向存放
给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
解题思路:
1.由于是反向存放的,那么链表首位就是个位,所以我们可以直接遍历链表获取数字
2.定义一个carry,用来保存进位,同时创建一个新链表来存放结果
源代码如下:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int carry=0;//进位
ListNode* head=new ListNode(-1);//新链表的头节点
ListNode* pre=head;//pre用来遍历新链表
//这里当l1和l2都为空时,还需要判断一下此时是否还有进位,
//若carry!=0,那么还需要再创建一个节点,节点值为carry
while(l1||l2||carry)
{
int num1=l1?l1->val:0;//若链表为空,相当于+0
int num2=l2?l2->val:0;
int sum=carry+num1+num2;//sum用来保存当前位上的数组总和是多少
carry=sum/10;
pre->next=new ListNode(sum%10);//当前位上的数字应该是sum对10取余
pre=pre->next;//pre指针更新
if(l1) l1=l1->next;
if(l2) l2=l2->next;
}
return head->next;
}
};
进阶版:正向存放
示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即716 + 592
输出:1->3->0->8,即1308
解题思路:
由于此时节点是正向存放,我们需要先找到个位数的数字,那么就要借助栈,(先进后出)来实现
首先将链表1和链表2分别入栈,栈顶元素即低位到高位的顺序
剩下的步骤与上面一题相似
源代码如下:
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
stack<int> s1, s2;//定义栈1,栈2
//l1所有节点入栈
while (l1) {
s1.push(l1 -> val);
l1 = l1 -> next;
}
//l2所有节点入栈
while (l2) {
s2.push(l2 -> val);
l2 = l2 -> next;
}
int carry = 0;//进位
ListNode* pre = nullptr;//定义一个空指针,用来尾插
while (!s1.empty() or !s2.empty() or carry != 0) {
//获取栈顶元素,栈为空时,就置为0
int a = s1.empty() ? 0 : s1.top();
int b = s2.empty() ? 0 : s2.top();
//栈顶元素出栈
if (!s1.empty()) s1.pop();
if (!s2.empty()) s2.pop();
//计算总和、进位
int sum = a + b + carry;
carry = sum / 10;
auto newnode = new ListNode(sum%10);
//这里是尾插
newnode -> next = pre;
pre = newnode;
}
//由于是采用尾插来创建链表,所以此时pre就是头节点
return pre;
}
};