求两个用链表表示的整数的和

给定两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。

进阶

      假设这些数位是正向存放的。

LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2, int carry)

{

/*两个链表全部都为空且进位为0,则函数返回*/

if (l1 == null &&l2 == null&&carry == 0)

{

return null;

}

LinkedListNode result = new LinkedListNode();

/*将value以及l1和l2的data相加*/

int value = carry;

if (l1 != null)

{

value += l1.data;

}

if (l2 != null)

{

value += l2.data;

}

result.data = value % 10;/*求和结果的个数*/

/*递归*/

LinkedListNode more = addLists(l1==null?null:l1.next,l2==null?null:l2.next,value>=10?1:0);

result.setNext(more);

return result;

}

在实现这段代码时,务必注意处理一个链表比另一个链表结点少的情况。不然可能会出现指针异常。

进阶

public class PartialSum

{

public LinkedListNode sum=null;

public int carry=0;

}

LinkedListNode addLists(LinkedListNode l1,LinkedListNode l2)

{

int len1=length(l1);

int len2=length(l2);

//用零填充较短的链表

if(len1<len2)

{

l1=padList(l1,len2-len1);

}

else

{

l2=padList(l2,len1-len2);

}

//对两个链表求和

PartialSum sum=addListsHelper(l1,l2);

//如有进位,则插入链表首部,否则,直接返回整个链表

if(sum.carry==0)

{

return sum.sum;

}

else

{

LinkedListNode result=insertBefore(sum.sum,sum.carry);

return result;

}

}

PartialSum addListsHelper(LinkedListNode l1,LinkedListNode l2)

{

if(l1==null && l2==null)

{

PartialSum sum=new PartialSum();

return sum;

}

//对较小数字递归求和

PartialSum sum=addListHelper(l1.next,l2.next);

//将进位和当前数据相加

int val=sum.carry +l1.data+l2.data;

//插入当前数字的求和结果

LinkedListNode full_result=insertBefore(sum.sum,val%10);

//返回求和结果和进位值

sum.sum=full_result;

sum.carry=val/10;

return sum;

}

//用零填充链表

LinkedListNode padList(LinkedListNode l,int padding)

{

LinkedListNode head=l;

for(int i=0;i<padding;i++)

{

LinkedListNode n=new LinkedListNode(0,null,null);

head.prev=n;

n.next=head;

head=n;

}

return head;

}

//辅助函数,将结点插入链表首部

LinkedListNode insertBefore(LinkedListNode list,int data)

{

LinkedListNode node=new LinkedListNode(data,null,null);

if(list!=null)

{

list.prev=node;

node.next=list;

}

return node;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-05 12:12:28

求两个用链表表示的整数的和的相关文章

求两个单链表公共结点

题目:输入两个单链表,找出公共结点. 思路:若两个单链表有公共结点,其形状必定为"Y"型,也就是说公共结点后的所有结点都是相同的. 我们首先获得两个链表的长度,求得长度之差为n,再定义两个指针分别指向两个链表首部,长链表先走n步,然后两个指针同时走,直到两个指针所指向的值完全相同时停止. 代码: /* 求链表公共结点 */ #include<stdio.h> #include<stdlib.h> typedef struct _NODE_ { int data;

2.5给定两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。

其实仔细想想是挺简单的,我们要做的只是记得进位. LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2, int carry) //LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2, int carry = 0) { if (l1 == null && l2 == null $$ carry == 0) { return null; } LinkedL

哈希(4) - 求两个链表的交集(intersection)以及并集(union)

给定两个链表,求它们的交集以及并集.用于输出的list中的元素顺序可不予考虑. 例子: 输入下面两个链表: list1: 10->15->4->20 list2: 8->4->2->10 输出链表: 交集list: 4->10 并集list: 2->8->20->4->15->10 方法1 (简单方法) 可以参考链表系列中的"链表操作 - 求两个链表的交集(intersection)以及并集(union)" 方法2

7_2判断两个单链表是否相交,若相交,求出第一个交点

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4251372.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:7_2判断两个单链表是否相交,若相交,求出第一个交点. 题目分析: 创建A,B两个单链表,将B的尾部指向头部,若两个单链表相交,则交点必为环的入口,这就又变成

求两个整数的最大公约数

<C和指针>第7章第2道编程题: 两个整型值M和N(M.N均大于0)的最大公约数可以按照下面的方法计算: 请编写一个名叫gcd的函数,它接受两个整型参数,并返回这两个数的最大公约数.如果这两个参数中的任何一个不大于零,函数返回零. 1 /* 2 ** 求两个整数的最大公约数 3 */ 4 5 #include <stdio.h> 6 7 int gcd( int M, int N ); 8 9 int 10 main() 11 { 12 int m, n; 13 scanf( &q

欧几里得算法求两个整数的最大公因数

unsigned int Gcd (unsigned int m,unsigned int n){ unsigned int rem; while(n>0){ rem = m % n; m = n; n = rem; } return m; } 对于m<n的情况,第一次循环m,n会交换 算法的时间复杂度计算 时间复杂度 logn 若M > N,则第一次循环交换M和N. 若想分析其时间复杂度,则要求循环次数,即生成余数的次数. 可以证明: 当M > N, 则M % N < M

12_1求两个整数中的较小值,要求不能使用比较运算符, if-else, a&gt;b?a:b, while for

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4253932.html  声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:求两个整数中的较小值,要求不能使用比较运算符, if-else, a>b?a:b, while for, 内嵌汇编递归第三方函数. 在网上看到一些网友给出了

(c语法百题7)求两数的整数商 和 余数

知识点: 求商和求余 /   和 % 的用法. 注意 /  中,两个%d的值为整数,即取整.有%f类的,就是商了,带小数的. 内容: 求两数的整数商 和 余数 输入说明: 一行两个整数 输出说明: 一行两个整数 输入样例: 若题目没有特别说明,则应该以多组测试数据方式读取,或者参考a001. 18 4 输出样例 : 4 2 #include <stdio.h> int main() { int a,b; scanf("%d %d",&a,&b); print

(c语法百题8)求两数的整数商 和 商

内容: 求两数的整数商 和 商 ,商保留两位小数 输入说明: 一行 两个整数 输出说明: 一行,一个整数,一个实数(两位小数) 输入样例: 若题目没有特别说明,则应该以多组测试数据方式读取,或者参考a001. 12 8 输出样例 : 1 1.50 #include <stdio.h> int main() { int a,b; scanf("%d %d",&a,&b); printf("%d %.2f\n",a/b,a/(1.0*b));