概述
面试题 02.05. 链表求和
给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?
示例:
输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912
今天,我们写一个链表求和,说句实在的,这题思路简单但是代码比较复杂,自己代码写的也是挺复杂,解题代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int r=0;
struct ListNode* pre,*p=l1;
while(l1&&l2){
l1->val=l1->val+l2->val+r;
r=0;
if(l1->val>=10){
r=1;
l1->val=l1->val-10;
}
pre=l1;
l1=l1->next;
l2=l2->next;
}
if(l1==NULL&&l2==NULL&&r==1){
struct ListNode* s=(struct ListNode* )malloc(sizeof(struct ListNode));
s->next=NULL;
s->val=1;
pre->next=s;
}
if(l1!=NULL){
if(r==1){
while(l1->val==9){
l1->val=0;
pre=l1;
l1=l1->next;
if(l1==NULL){
struct ListNode* s=(struct ListNode* )malloc(sizeof(struct ListNode));
s->next=NULL;
s->val=1;
pre->next=s;
break;
}
}
if(l1!=NULL){
l1->val=l1->val+1;
}
}
}
// printf("%d ",r);
if(l1==NULL&&l2!=NULL){
pre->next=l2;
printf("%d ",r);
if(r==1){
while(l2->val==9){
l2->val=0;
pre=l2;
l2=l2->next;
if(l2==NULL){
struct ListNode* s=(struct ListNode* )malloc(sizeof(struct ListNode));
s->next=NULL;
s->val=1;
pre->next=s;
break;
}
}
if(l2!=NULL){
l2->val=l2->val+1;
}
}
}
return p;
}
最后
以上就是单薄太阳为你收集整理的面试题 02.05. 链表求和的全部内容,希望文章能够帮你解决面试题 02.05. 链表求和所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复