题目要求:
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
//3.链表相加两个数
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
stack<int >s1;
stack<int >s2;
//链表l1进栈s1
while(l1)
{
s1.push(l1->val);
l1=l1->next;
}
//链表l2进栈s2
while(l2)
{
s2.push(l2->val);
l2=l2->next;
}
int carry=0 ;//进位
ListNode*ans=nullptr;
while(!s1.empty() or !s2.empty() or carry!=0 )//carry!=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 cur=a+b+carry;
carry=cur/10;
cur=cur%10;
auto curnode=new ListNode(cur);//申请新内存存放求和之后的链表
//头插法插入数据
curnode->next=ans;//修改当前节点的下个节点指向
ans=curnode;
}
return ans;
}
测试代码:
/*************************************************************************
> File Name: 5-两链表相加.cpp
> Author:
> Mail:
> Created Time: Mon 28 Mar 2022 10:30:00 AM CST
题目:
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头
思路;用栈,栈的先进后出特点适合干这逆向实现
************************************************************************/
#include<iostream>
#include<stack>
using namespace std;
class Solution
{
public:
struct ListNode
{
int val;
struct ListNode*next;
ListNode(int val):val(val),next(nullptr){}
};
//1. 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点
ListNode*addAtHead(int val)
{
ListNode* newNode = new ListNode(val);
newNode->next = _dummyHead->next;
_dummyHead->next = newNode;
return _dummyHead->next;
}
// 2.打印链表
void printLinkedList()
{
ListNode* cur = _dummyHead;
while (cur->next != nullptr)
{
cout << cur->next->val << " ";
cur = cur->next;
}
cout << endl;
}
//3.链表相加两个数
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
stack<int >s1;
stack<int >s2;
//链表l1进栈s1
while(l1)
{
s1.push(l1->val);
l1=l1->next;
}
//链表l2进栈s2
while(l2)
{
s2.push(l2->val);
l2=l2->next;
}
int carry=0 ;//进位
ListNode*ans=nullptr;
while(!s1.empty() or !s2.empty() or carry!=0 )//carry!=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 cur=a+b+carry;
carry=cur/10;
cur=cur%10;
auto curnode=new ListNode(cur);//申请新内存存放求和之后的链表
//头插法插入数据
curnode->next=ans;//修改当前节点的下个节点指向
ans=curnode;
}
return ans;
}
ListNode* _dummyHead= new ListNode(0);
};
int main()
{
//测试说明:
//在s1链表里头插法输入1 2 3 4 ,即4在头;
//在s2链表里头插法输入9 10 3 10 ,即10在头;
Solution s1,s2,s3;
s1.addAtHead(1);
s1.addAtHead(2);
s1.addAtHead(3);
Solution::ListNode*l1=s1.addAtHead(4);
s1.printLinkedList();
s2.addAtHead(9);
s2.addAtHead(10);
s2.addAtHead(3);
Solution::ListNode*l2=s2.addAtHead(10);
s2.printLinkedList();
Solution::ListNode*ret= s3.addTwoNumbers(l1,l2);
//打印相加后链表结果
while(ret)
{
cout<<ret->val<<" ";
ret=ret->next;
}
cout << endl;
return 0;
}