LeetCode刷题笔记-2.两数相加
C代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *head = NULL;
struct ListNode *tail = NULL;
struct ListNode *temp = NULL;
int len1 = 0;
int len2 = 0;
int carry = 0;
int i;
tail = l1;
while(tail != NULL) {
len1++;
//注意点1:注意遍历变化,不然死循环超时;
tail = tail->next;
}
tail = l2;
while(tail != NULL) {
len2++;
tail = tail->next;
}
if (len1 == 0) {
return l2;
}
if (len2 == 0) {
return l1;
}
if (len1 < len2) {
temp = l1;
l1 = l2;
l2 = temp;
len1 = len2;
}
head = tail = l1;
//注意点2:循环的条件应该是处理完最长List的最后一个节点
while(1) {
int n2 = l2 == NULL ? 0 : l2->val;
tail->val += n2;
tail->val += carry;
carry = tail->val / 10;
tail->val %= 10;
if (tail->next == NULL) {
break;
}
tail = tail->next;
if (l2 != NULL) {
l2 = l2->next;
}
}
//注意点3:退出循环后,该处的carry只属于下一个node
if (carry != 0) {
temp = calloc(1, sizeof(*temp));
temp->val = carry;
temp->next = NULL;
tail->next = temp;
tail = tail->next;
}
return head;
}
注意点
- 遍历链表获取长度时注意迭代
tail=tail->next
的变化,避免死循环; - 注意需要处理完较长的链表的最后一个节点再退出遍历;
- 注意退出合并循环以后,需要检查carry,该carry值属于新的节点;
结果
思路
两个链表一样长
List1比List2短
当List1为空
直接返回List2
当List1不为空
List1比List2长
当List2为空
直接返回List1
当List2不为空
与List2比List1长且List1不为空的处理方式对称