题目来源于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) a=1,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->next&&NULL != num2->next) { num1 = num1->next; num2 = num2->next; num1->val += num2->val+add; 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}