题目:
参考解法:
/*** 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;}
};
分析:
这里是从尾巴开始从右到左相加的,那么我们可以把数据先入栈,然后分别出栈,得到的相加结果,存储到新节点。
注意的是循环中的判断条件的书写。
注意这里的头插法,是因为最后输出是要如此。