将两个链表的值进行相加,并返回一个新的链表,注意两个地方:一是考虑两个链表的长度是否相同,二是考虑相加后的进位问题,
其实长度不需要太多考虑,只要将该值置0即可。
方法一:将两个链表长度置为相同,对于其中一个长度较短的,后面加零,然后以相同的条件进行遍历
方法二:只考虑是否为空,为空则将其值返回0.
方法一是我第一次想到的方法,但是写起代码来有很多冗余,方法二是比较简洁的方法,也是Leetcode中提倡的方法:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode *p1 = NULL, *m1 = NULL;
struct ListNode *tmpNode = NULL;
p1 = l1;
m1 = l2;
struct ListNode *retList = NULL;
struct ListNode *lastNode = retList;
int carry = 0, TotalSum = 0, tmpSum = 0, val1 = 0, val2 = 0;
while(p1 || m1)
{
val1 = (p1 ? p1->val : 0);
val2 = (m1 ? m1->val : 0);
TotalSum = val1 + val2 +carry;
carry = TotalSum / 10;
tmpSum = TotalSum % 10;
tmpNode = malloc(sizeof(struct ListNode));
tmpNode->next = NULL;
tmpNode->val = tmpSum;
if (!retList)
{
retList = tmpNode;
lastNode = retList;
}
else
{
lastNode->next = tmpNode;
lastNode = tmpNode;
}
//go ahead
if(p1)
p1 = p1->next;
if(m1)
m1 = m1->next;
}
if (carry)
{
tmpNode = malloc(sizeof(struct ListNode));
tmpNode->next = NULL;
tmpNode->val = carry;
if (!retList)
{
retList = tmpNode;
lastNode = retList;
}
else
{
lastNode->next = tmpNode;
lastNode = tmpNode;
}
}
return retList;
}