记录一下。
执行用时:8 ms, 在所有 C 提交中击败了96.50% 的用户
内存消耗:7.2 MB, 在所有 C 提交中击败了91.19% 的用户
通过测试用例:1568 / 1568
此算法原理不难,主要是链表的一些简单操作糅合在一起比较容易出bug。。。
第一个while之后分为三种情况:
1.p1还没遍历完;
2.p2还没遍历完;
3.p1和p2都遍历完了但是还有一位没进位,注意这一步一定要放在最后一步,因为前两步完成之后还有可能出现这种情况。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* p1, struct ListNode* p2){
int f;
int num;
struct ListNode* h,*r,*pre;
pre = r = NULL;
h = p2;f = 0;
while(p1&&p2){
num = p1->val + p2->val + f;
p2->val = num%10;
f = num/10;
p1 = p1->next;
pre = p2;
p2 = p2->next;
}
p2 = pre;
if(p1 != NULL){
while(p1 != NULL){
r = (struct ListNode*)malloc(sizeof(struct ListNode));
r->next = NULL;
num = p1->val + f;
r->val = num%10;
f = num/10;
p1 = p1->next;
p2->next = r;
p2 = r;
}
}else if(p2->next != NULL){
while(p2->next != NULL){
p2 = p2->next;
num = p2->val + f;
p2->val = num%10;
f = num/10;
}
}
if(p1 == NULL && p2->next == NULL){
if(f != 0){
r = (struct ListNode*)malloc(sizeof(struct ListNode));
r->next = NULL;
r->val = 1;
p2->next = r;
p2 = r;
}
}
return h;
}