给定两个非空链表来代表两个非负整数,位数按照逆序方式存储,它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
自己写的代码然后想的是用O(n)的时间复杂度过,但是过不了8->9和1这组数,感觉能过的.....很烦。
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; *///不能过的代码,能过的在下面。
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) { struct ListNode *l,*r,*s; l=(struct ListNode *)malloc(sizeof(struct ListNode)); l->next=NULL; s=l; int flag=0; while(l1!=NULL&&l2!=NULL) { r=(struct ListNode *)malloc(sizeof(struct ListNode)); if(l1->val+l2->val+flag>9) { r->val=l1->val+l2->val-10+flag; flag=1; } else { r->val=l1->val+l2->val+flag; flag=0; } s->next=r; s=r; l1=l1->next; l2=l2->next; } s->next=NULL; while(l1!=NULL&&l2==NULL) { r=(struct ListNode *)malloc(sizeof(struct ListNode)); if(flag==1) { if(l1->val+flag>9) { r->val=l1->val+flag-10; } else { r->val=l1->val+flag; flag=0; } } else { r->val=l1->val; } r->val=l1->val; s->next=r; s=r; l1=l1->next; } s->next=NULL; while(l1==NULL&&l2!=NULL) { r=(struct ListNode *)malloc(sizeof(struct ListNode)); if(flag==1) { if(l2->val+flag>9) { r->val=l2->val+flag-10; } else { r->val=l2->val+flag; flag=0; } } else { r->val=l2->val; } s->next=r; s=r; l2=l2->next; } s->next=NULL; if(flag) { r=(struct ListNode *)malloc(sizeof(struct ListNode)); r->val=flag; s->next=r; s=r; flag=0; } s->next=NULL; return (l->next); }
看了一会别人的代码就过了复杂度相同,然后....感觉了差距。哎。。。。
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) { struct ListNode *l,*r,*s; l=(struct ListNode *)malloc(sizeof(struct ListNode)); l->next=NULL; r=l; int carry=0; while(l1||l2||carry) { int sum=(l1?l1->val:0)+(l2?l2->val:0)+carry; carry=sum/10; int vit=sum%10; s=(struct ListNode *)malloc(sizeof(struct ListNode)); s->val=vit; r->next=s; r=s; l1=l1?l1->next:l1; l2=l2?l2->next:l2; } r->next=NULL; return l->next; }