2.5链式A+B

有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。

给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)。

测试样例:
{1,2,3},{3,2,1}
返回:{4,4,4}

学习总结:1.进位的时候用一个标志temp 2.新建一个链,可以使用new方法 3.注意判断各种长短情况
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class Plus {
public:
    ListNode* plusAB(ListNode* a, ListNode* b) {
        // write code here
        //思考:如果是没有进位的情况,只要一个加一个就好了,
        //循环中需要考虑两个链表的共同长度,可能一个结束了,一个还没有结束。
        //可以用0来填补那个空的,相加起来,但是究竟哪个长,哪个短?不好判断啊
        //看了别人讨论的结果,发现进位很简单,只要加入个temp进位就可以了,其他的编写和我
        //写的差不多,就是通不过啊,不造怎么回事儿。
        ListNode* s = NULL;
        ListNode* pHead = NULL;
        int temp = 0;
        int sum = 0;
        if(a == NULL || b == NULL) return NULL;
        for(a, b; a != NULL && b != NULL; a = a->next, b = b->next){
            if(s == NULL){
                sum = a->val + b->val;
                s = a;
                s->val = sum % 10;
                temp = sum / 10;
                pHead = s;
            }
            else{
                sum = a->val + b->val + temp;
                temp = sum / 10;
                s->next->val = sum % 10;
                s->next = a;
                s = a;
            }
        }
        if(a == NULL && b != NULL){
            for(b; b != NULL; b = b->next){
                s->next = b;
                sum = b->val + temp;
                b->val = sum % 10;
                temp = sum / 10;
            }
        }
        if(a != NULL && b == NULL){
            for(a; a != NULL; a = a->next){
                sum = a->val + temp;
                a->val = sum % 10;
                temp = sum / 10;
            }
        }
        else{
            if(temp > 0){
                ListNode* newNode = new ListNode(temp); //新建一个链路的写法。
                s->next = newNode; 
            }   
        }
        return pHead;
    }
};

 

posted @ 2016-04-11 14:40  梦幻之海  阅读(253)  评论(0编辑  收藏  举报