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; } };