给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) 输出: 7 -> 8 -> 0 -> 7
//==================链表转成数组,累加,再转换成链表=======================================
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
//特殊条件
if(l1==NULL)
return l2;
if(l2==NULL)
return l1;
//计算l1的长度
int len1 = 0;
struct ListNode *next1 = l1;
while(next1) {
len1++;
next1 = next1->next;
}
//计算l2的长度
int len2=0;
struct ListNode *next2 = l2;
while(next2) {
len2++;
next2 = next2->next;
}
//计算l1和l2的最大长度
int len = len1 > len2 ? len1 : len2;
//设置一个最大长度的数组
int a[len];
//把l1中的节点数值存放到数组里面去
next1 = l1;
int i = len - len1, idx = 0;
while(next1) {
if(i > 0) {
i--;
a[idx++] = 0;
} else {
a[idx++] = next1->val;
next1 = next1->next;
}
}
//把l2中的节点数值存放到数组里面去,与l1中的数值相累加
i = len - len2;
idx = 0;
next2 = l2;
while(next2) {
if(i > 0) {
i--;
idx++;
} else {
a[idx++] += next2->val;
next2 = next2->next;
}
}
//从数组索引最大值len-1,即链表中的最后一个数,创建节点作为初始的头节点
struct ListNode *head = malloc(sizeof(struct ListNode));
head->val = a[len-1] % 10;
head->next=NULL;
int s = a[len-1] / 10; //进位标记
//该节点作为新链表的头结点
struct ListNode *pnext = head;
struct ListNode *node=NULL;
//数组程度为len,最大索引len-1已经创建节点,则从len-2开始往前遍历
for(i=len-2;i>=0;i--)
{
node = malloc(sizeof(struct ListNode));
node->val = (s + a[i]) % 10; //注意加上进位标记
node->next = pnext; //插入新链表头部,形成新的头节点
pnext = node;
s = (s + a[i]) / 10; //产生进位标记
}
//如果有进位标记,则说明两者累加最高位有进位
if(s == 1)
{
node = malloc(sizeof(struct ListNode));
node->val = s;
node->next= pnext;
pnext = node;
}
return pnext;
}