题目:
参考解法:
/**
* 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) {
vector<int> nums1, nums2;//定义两个向量
while(l1) {//入栈
nums1.push_back(l1->val);
l1 = l1->next;
}
while(l2) {
nums2.push_back(l2->val);
l2 = l2->next;
}
int m = nums1.size(), n = nums2.size();
int sum = 0, carry = 0;
ListNode *head = nullptr, *p = nullptr;//这里没有建立头结点,只有头指针
for(int i = m - 1, j = n - 1; i >= 0 || j >= 0 || carry > 0; i--, j--) {
sum = carry;
if(i >= 0)//这里两个判断,也隐含处理了长短不一的问题
sum += nums1[i];
if(j >= 0)
sum += nums2[j];
carry = sum / 10;
p = new ListNode(sum%10);
p->next = head;
head = p;
}
return head;
}
};
分析:
这里是从尾巴开始从右到左相加的,那么我们可以把数据先入栈,然后分别出栈,得到的相加结果,存储到新节点。
注意的是循环中的判断条件的书写。
注意这里的头插法,是因为最后输出是要如此。