C语言实现两数相加2018-09-23
/*给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807*/
/**
* definition for singly-linked list.
* struct listnode {
* int val;
* struct listnode *next;
* };
*/
struct listnode* addtwonumbers(struct listnode* l1, struct listnode* l2)
{
struct listnode *p = null, *q = null, *head = null;
int index = 0, x, y, sum = 0;
while (l1 != null || l2 != null)
{
x = (l1 != null) ? l1->val : 0; /*当l1非空时x等于l1所指向的值*/
y = (l2 != null) ? l2->val : 0; /*当l2非空时y等于l2所指向的值*/
sum = x + y + index; /*求和的时候记得加上用来进位的index*/
p = (struct listnode*)malloc(sizeof(struct listnode));
if (p != null) /*当节点分配成功*/
{
p->val = sum % 10; /*对和求余数*/
index = sum / 10; /*计算是否需要进位*/
p->next = null;
}
if (q == null) /*才产生了一个节点的时候,让head指向该节点*/
{
q = p;
head = q;
}
else
{
q->next = p; /*将每一个节点连接起来*/
q = p;
}
/*判断l1是否已经指向了一个空节点,这一步很重要, 也很危险,切记不能写成if(l1->next!null)这样会产生死循环(l1和l2一直指向最后一个节点)*/
if (l1)
l1 = l1->next;
if (l2)
l2 = l2->next;
}
if (index == 1) /*当最后一个节点相加超过10了,需要再产生一个节点来完成进位*/
{
p = (struct listnode*)malloc(sizeof(struct listnode));
if (p != null)
{
p->val = 1;
p->next = null;
q->next = p;
q = p;
}
}
return head;
}
/*心得:
*1、写过程略微复杂一点的程序一定要写好伪代码,然后在写的过程中再转化为标准c语言;
*2、对于指针的使用,在指针改变指向,即移动或者交换的时候一定要留心,当指针移动的时候出现麻烦,可以往后思考一步到两步,就可以发现其问题;
*3、对于相似问题的求解,一定要学会归纳一个模型,即使用几行代码就可以实现一系列相似问题的求解。
*/
上一篇: LeetCode 103. 二叉树的锯齿形层序遍历
下一篇: HUD 2002 球体积