描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路:
1.新建一个链表,用来存储结果。
2.遍历两个列表,从两个链表的头结点开始,将每次对应位置的数相加,若有进位则使用变量carry记录进位。需要考虑到链表的三种情况:
(1)链表L1长度小于L2;(2)链表L1长度大于L2;(2)两链表长度相同。
这里要分别考虑三种情况,若有一个链表已经为空,则只加另一个链表的结点数值即可。
3.最终要考虑到最后一位的进位情况,若最后一位有进位,则最后一个新建的结点的值置1,否则删除最后一个结点。这里使用了前后双指针pre和p来解决。
4.最终结果不太好。
解答:
/**
* 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) {
ListNode* headNode = new ListNode;
ListNode* p = headNode;
ListNode* pre = new ListNode();
pre->next = p;
int carry = 0;//进位
while(l1 || l2){
ListNode* newNode = new ListNode();
p->next = newNode;
if(l1 == NULL){
int tmp = l2->val + carry;
carry = tmp/10;
p->val = tmp%10;
}
else if(l2 == NULL){
int tmp = l1->val + carry;
carry = tmp/10;
p->val = tmp%10;
}else{
int tmp = l1->val + l2->val + carry;
carry = tmp/10;
p->val = tmp%10;
}
if(p) p = p->next;
if(pre) pre = pre->next;
if(l1)l1 = l1->next;
if(l2)l2 = l2->next;
}
if(carry == 1) p->val = 1;
if(p->val == 0) pre->next = NULL;
return headNode;
}
};