leetcode 2nd problem add two numbers

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/duringsummer/article/details/79954149

1.读题
a.倒序的两个链表,均不为空。
b.数据格式除了0以外开头不能为0。

2.思路
和数据结构选择的大作业类似,大整数加减,不过逆序无需构造循环链表。

3.反思
解题步骤清楚,但是变量的放置位置很有讲究,本来想对个位数做统一处理,发现逻辑上就有问题,因为,涉及到:
a.个位数加个位数,可能不进位的情况。
b.统一的流程只能是有一者或者两者指针移动的循环控制流,两者唯一确定的是都有个位,头结点必须保留作为返回值。

4.注意点和异常处理
a.指针移动要统一。
b.位数不对齐,时刻要考虑,一个链表为空,一个不为空的情况。
c.最后对进位统一处理。

5.代码

/**
 * 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 *sum=new ListNode((l1->val+l2->val)%10);
    int carry = (l1->val+l2->val)/10;
    ListNode* cur = sum;
    ListNode* pn1 = l1->next;
    ListNode* pn2 = l2->next;
        while(pn1!=NULL||pn2!=NULL)
        {


            while(pn1!=NULL&&pn2!=NULL)
            {
                ListNode *point = new ListNode((pn1->val+pn2->val+carry)%10);
                carry = (pn1->val+pn2->val+carry)/10;
                cur->next = point;
                cur = cur->next;
                pn1 = pn1->next;
                pn2 = pn2->next;
            }
            if(pn1!=NULL)
            {
                ListNode *point = new ListNode((pn1->val+carry)%10);
                carry = (pn1->val+carry)/10;
                cur->next = point;
                cur = cur->next;
                pn1 = pn1->next;
            }
            if(pn2!=NULL)
            {
                ListNode *point = new ListNode((pn2->val+carry)%10);
                carry = (pn2->val+carry)/10;
                cur->next = point;
                cur = cur->next;
                pn2 = pn2->next;  
            }


        }

    if(carry!=0)
    {
        ListNode *point = new ListNode(1);
        cur->next = point;
        cur = cur->next;  
    }
    return sum;

    }
};
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页