大概思路:遍历链表,两两相加并加上进位数,产生新的进位数用以下一次相加,直到其中一个链表到尾。然后继续遍历没到尾的链表。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode *head = (struct ListNode*)malloc(sizeof(struct ListNode));
head->next = NULL;
struct ListNode *tail = head; //tail指向尾结点,用于插入新结点;
struct ListNode *createNode; //createNode用于创建新结点
struct ListNode *newHead; //返回的头指针
struct ListNode *p1 = l1, *p2 = l2;//用于遍历
char carry = 0; //用于进位
/*同时向后遍历两个链表,直到至少其中一个为NULL*/
while(p1 != NULL && p2 != NULL)
{
createNode = (struct ListNode*)malloc(sizeof(struct ListNode));
createNode->val = (p1->val + p2->val + carry) % 10; //相加
carry = (p1->val + p2->val + carry) / 10; //进位
tail->next = createNode;
tail = tail->next;
tail->next = NULL; //插入
p1 = p1->next;
p2 = p2->next;
}
/*如果p1还不是NULL,继续遍历*/
while(p1 != NULL)
{
if(carry == 0) //如果不需要再进位了,则把l1剩余的部分直接接在新链表的后面
{
tail->next = p1;
newHead = head->next; //由于题目要求的头结点是包含数据的,所以返回的是第二个结点地址
free(head);
return newHead;
}
createNode = (struct ListNode*)malloc(sizeof(struct ListNode));
createNode->val = (p1->val + carry) % 10;
carry = (p1->val + carry) / 10;
tail->next = createNode;
tail = tail->next;
tail->next = NULL;
p1 = p1->next;
}
/*如果p2还不是NULL,继续遍历*/
while(p2 != NULL)
{
if(carry == 0) //如果不需要再进位了,则把l2剩余的部分直接接在新链表的后面
{
tail->next = p2;
newHead = head->next; //由于题目要求的头结点是包含数据的,所以返回的是第二个结点地址
free(head);
return newHead;
}
createNode = (struct ListNode*)malloc(sizeof(struct ListNode));
createNode->val = (p2->val + carry) % 10;
carry = (p2->val + carry) / 10;
tail->next = createNode;
tail = tail->next;
tail->next = NULL;
p2 = p2->next;
}
if(carry != 0) //当l1、l2所有结点都加完了,可能会剩一位需要进位
{
createNode = (struct ListNode*)malloc(sizeof(struct ListNode));
createNode->val = carry;
tail->next = createNode;
tail = tail->next;
tail->next = NULL;
}
newHead = head->next; //由于题目要求的头结点是包含数据的,所以返回的是第二个结点地址
free(head);
return newHead;
}