程序员面试金典-0205-链表求和
一个有意思的错误:假如没有清理上次的flag,会影响下一次操作
题目描述:
给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?
示例:
输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-lists-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
code:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
static int flag=0;
void insert_node(int t1,int t2,struct ListNode * temp){
int t = t1+t2+flag;
if(t>9){
flag=1;
t=t-10;
}
else{
flag=0;
}
struct ListNode * temp_node = malloc(sizeof(struct ListNode));
temp_node->val=t;
temp_node->next=NULL;
temp->next=temp_node;
}
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
flag=0;
struct ListNode * p1 = l1;
struct ListNode * p2 = l2;
if(p1==NULL && p2==NULL)
return NULL;
struct ListNode * ret = malloc(sizeof(struct ListNode));
ret->val = 0;
ret->next=NULL;
struct ListNode * temp = ret;
while(p1!=NULL && p2!=NULL){
insert_node(p1->val,p2->val,temp);
p1=p1->next;
p2=p2->next;
temp=temp->next;
}
while(p1!=NULL){
insert_node(p1->val,0,temp);
p1=p1->next;
temp=temp->next;
}
while(p2!=NULL){
insert_node(p2->val,0,temp);
p2=p2->next;
temp=temp->next;
}
if(flag==1){
struct ListNode * temp_node=malloc(sizeof(struct ListNode));
temp_node->val=1;
temp_node->next=NULL;
temp->next=temp_node;
}
return ret->next;
}