北京企业网站开发公司哪家好,关于电商网站建设与管理的书籍,搜索引擎营销案例分析题,wordpress下载主题题目来源于leetcode第二题两数相加。题目描述给出两个非空的链表用来表示两个非负的整数。其中#xff0c;它们各自的位数是按照逆序的方式存储的#xff0c;并且它们的每个节点只能存储一位数字。如果#xff0c;我们将这两个数相加起来#xff0c;则会返回一个新的链表来…题目来源于leetcode第二题两数相加。题目描述给出两个非空的链表用来表示两个非负的整数。其中它们各自的位数是按照逆序的方式存储的并且它们的每个节点只能存储一位数字。如果我们将这两个数相加起来则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外这两个数都不会以 0 开头。例如说输入2 4 3 5 6 4输出7 0 8因为342 465 807思路这道题很好啊用的是大数运算的思想也叫高精度。就是说一个链表存储一个数一个节点存一个数位进行加法运算。有三个需要注意的地方。首先是如果一个数已经没下一位了就没必要再继续下去了就像这样因为是链表我直接就把下一位的地址接过来了。然后就是可能会有某种极端情况一直有进位还有就是会出现结果位数比加数多的可能。就像下面这样。代码实现 struct ListNode { int val; struct ListNode *next; };#define CARRY(a,b) a1,b-10 //高精度加法 struct ListNode* addTwoNumbers(struct ListNode* num1, struct ListNode* num2) { int add 0; //p是最后结果 struct ListNode* p; p num1; //进行第一次运算 num1-val num2-val add; //有进位 if (num1-val 9) { CARRY(add, num1-val); } while (NULL ! num1-nextNULL ! num2-next) { num1 num1-next; num2 num2-next; num1-val num2-valadd; add 0; if (num1-val 9) { CARRY(add, num1-val); } } if (!num1-next)num1-next num2-next;0 //进行最后的进位运算31 while (add){32 if (!num1-next) {33 num1-next (struct ListNode*)malloc(sizeof(struct ListNode));34 num1-next-next NULL;35 num1-next-val 0;36 }37 num1 num1-next;38 num1-val;39 add 0;40 if (num1-val 9) {41 CARRY(add, num1-val);42 }43 } 44 return p;45}