leetcode第2题:2.两数相加
其中动态构造新链表的方法为:使用左右指针进行构造
struct ListNode* head = NULL, tail = NULL;
...
...
if () {
head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));
tail->val = ...;
tail->next = NULL;
} else {
tail->next = (struct ListNode*)malloc(sizeof(struct ListNode));
tail->next->val = ...;
tail = tail->next;
tail->next = NULL;
}
全部代码:
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
struct ListNode *head = NULL, *tail = NULL;
int carry = 0;
while(l1 || l2) {
/* 若l1、l2上还有数没加完,将剩下数字得个位上的数存入n1、n2
* 若l1、l2没有数了,直接赋值为0
*/
int n1 = l1 ? l1->val : 0;
int n2 = l2 ? l2->val : 0;
/* 先从个位相加 */
int sum = n1 + n2 + carry;
if(!head) { /* 首次计算 */
head = tail = (struct ListNode *) malloc( sizeof(struct ListNode) );
tail->val = sum % 10; /* 存储余数 */
tail->next = NULL;
} else {
tail->next = (struct ListNode *)malloc( sizeof(struct ListNode) );
tail->next->val = sum % 10;
tail = tail->next;
tail->next = NULL;
}
carry = sum / 10; /* 存储进位数 */
if(l1) { /* 若还有数,则调整指针 */
l1 = l1->next;
}
if(l2) { /* 若还有数,则调整指针 */
l2 = l2->next;
}
}
if (carry > 0) { /* 若最高位相加有进位数,则调整链表存储进位数 */
tail->next = (struct ListNode *) malloc( sizeof(struct ListNode) );
tail->next->val = carry;
tail = tail->next;
tail->next = NULL;
}
return head;
}