题目
给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
进阶:假设这些数位是正向存放的,请再做一遍。
示例:
输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912
思路
短链表补0至于长链表一样长度,再将两链表相加于任一链表,最后查看最后进位,如果为1,则再分配一个节点补1。如果为0,直接返回。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* temp;
struct ListNode* prev1=NULL;
struct ListNode* prev2=NULL;
struct ListNode* current1=l1;
struct ListNode* current2=l2;
int carry=0;
int len1=0,len2=0;
while(current1){
len1++;
prev1=current1;
current1=current1->next;
}
while(current2){
len2++;
prev2=current2;
current2=current2->next;
}
if(len1==len2)
;
else if(len1>len2){ //补0
int nums=len1-len2;
for(int i=0;i<nums;i++){
prev2->next=malloc(sizeof(struct ListNode));
prev2->next->val=0;
prev2=prev2->next;
}
prev2->next=NULL;
}
else{ //补0
int nums=len2-len1;
for(int i=0;i<nums;i++){
prev1->next=malloc(sizeof(struct ListNode));
prev1->next->val=0;
prev1=prev1->next;
}
prev1->next=NULL;
}
current1=l1;
current2=l2;
while(current1&¤t2){
if(current1->val+current2->val+carry<10){
current1->val=(current1->val+current2->val+carry)%10;
carry=0;
}
else{
current1->val=(current1->val+current2->val+carry)%10;
carry=1;
}
if(current1->next==NULL){
temp=current1;
}
current1=current1->next;
current2=current2->next;
}
if(carry){
temp->next=malloc(sizeof(struct ListNode));
temp->next->val=1;
temp->next->next=NULL;
}
return l1;
}
执行结果:
通过
显示详情
执行用时 :12 ms, 在所有 C 提交中击败了94.08% 的用户
内存消耗 :7 MB, 在所有 C 提交中击败了100.00%的用户