题目
给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 8 -> 0 -> 7
思路
将两个链表反转,然后创建一个新链表保存每一位相加的结果,然后将新链表再次反转。
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* prev=NULL;
struct ListNode* current=head;
struct ListNode* next;
while(current){
next=current->next;
current->next=prev;
prev=current;
current=next;
}
return prev;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* new_l1=reverseList(l1);
struct ListNode* new_l2=reverseList(l2);
struct ListNode* new_list_head_node=malloc(sizeof(struct ListNode));
struct ListNode* record=new_list_head_node;
struct ListNode* temp;
new_list_head_node->val=0;
new_list_head_node->next=NULL;
int carry=0;
while(new_l1&&new_l2){
if(new_l1->val+new_l2->val+carry<10){
new_list_head_node->next=malloc(sizeof(struct ListNode));
new_list_head_node->next->val=(new_l1->val+new_l2->val+carry)%10;
new_list_head_node=new_list_head_node->next;
carry=0;
}
else{
new_list_head_node->next=malloc(sizeof(struct ListNode));
new_list_head_node->next->val=(new_l1->val+new_l2->val+carry)%10;
new_list_head_node=new_list_head_node->next;
carry=1;
}
new_l1=new_l1->next;
new_l2=new_l2->next;
}
temp=record->next;
new_list_head_node->next=NULL;
record->next=NULL;
free(record);
if(new_l1==NULL&&new_l2==NULL){ //两个链表长度一致
if(carry==0){
struct ListNode* sumList=reverseList(temp);
return sumList;
}
else{
new_list_head_node->next=malloc(sizeof(struct ListNode));
new_list_head_node->next->val=1;
new_list_head_node->next->next=NULL;
struct ListNode* sumList=reverseList(temp);
return sumList;
}
}
if(new_l1==NULL&&new_l2!=NULL){
while(new_l2){
if((new_l2->val+carry)<10){
new_list_head_node->next=malloc(sizeof(struct ListNode));
new_list_head_node->next->val=(new_l2->val+carry)%10;
new_list_head_node=new_list_head_node->next;
carry=0;
}
else{
new_list_head_node->next=malloc(sizeof(struct ListNode));
new_list_head_node->next->val=(new_l2->val+carry)%10;
new_list_head_node=new_list_head_node->next;
carry=1;
}
new_l2=new_l2->next;
}
if(carry){
new_list_head_node->next=malloc(sizeof(struct ListNode));
new_list_head_node->next->val=1;
new_list_head_node->next->next=NULL;
struct ListNode* sumList=reverseList(temp);
return sumList;
}
else{
new_list_head_node->next=NULL;
struct ListNode* sumList=reverseList(temp);
return sumList;
}
}
if(new_l2==NULL&&new_l1!=NULL){
while(new_l1){
if((new_l1->val+carry)<10){
new_list_head_node->next=malloc(sizeof(struct ListNode));
new_list_head_node->next->val=(new_l1->val+carry)%10;
new_list_head_node=new_list_head_node->next;
carry=0;
}
else{
new_list_head_node->next=malloc(sizeof(struct ListNode));
new_list_head_node->next->val=(new_l1->val+carry)%10;
new_list_head_node=new_list_head_node->next;
carry=1;
}
new_l1=new_l1->next;
}
if(carry){
new_list_head_node->next=malloc(sizeof(struct ListNode));
new_list_head_node->next->val=1;
new_list_head_node->next->next=NULL;
struct ListNode* sumList=reverseList(temp);
return sumList;
}
else{
new_list_head_node->next=NULL;
struct ListNode* sumList=reverseList(temp);
return sumList;
}
}
return NULL;
}
结果
执行结果:
通过
显示详情
执行用时 :12 ms, 在所有 C 提交中击败了96.91% 的用户
内存消耗 :7.4 MB, 在所有 C 提交中击败了100.00%的用户