概述
1.题目表述
单向链表的每个节点代表一位非负十进制数,每个单向链表表示一个非负十进制数,链表头代表低位。
现将连个链表相加,返回一个链表代表相加结果,每个节点仍代表一位十进制位。
2.实现及注释,难度较小,注意细节即可
/**
* Definition for singly-linked list.
* struct ListNode {
*
int val;
*
ListNode *next;
*
ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if(l1==NULL && l2==NULL) return NULL;//防止输入有误
int carrybit=0;//进位初始化为0
ListNode* head=new ListNode(0),*ptemp=head;//首先,通过哨兵头结点避免对首节点的讨论
while(l1!=NULL && l2!=NULL){//链表长度不一定相等
int add=l1->val+l2->val+carrybit;
ptemp->next=new ListNode(add%10);
ptemp=ptemp->next;
carrybit=add/10;
l1=l1->next;
l2=l2->next;
}
while(l1!=NULL){
int add=l1->val+carrybit;
ptemp->next=new ListNode(add%10);
ptemp=ptemp->next;
carrybit=add/10;
l1=l1->next;
}
while(l2!=NULL){
int add=l2->val+carrybit;
ptemp->next=new ListNode(add%10);
ptemp=ptemp->next;
carrybit=add/10;
l2=l2->next;
}
if(carrybit!=0){//此处易错!! 两链表都为空时还要讨论进位的情况!!!
//如 l1 =>5
l2=> 5
ptemp->next=new ListNode(carrybit);
}
ptemp=head->next;
delete head;//避免内存泄漏
return ptemp;//返回哨兵头结点的后一个节点
}
};
补充:LeetCode上牛人的写法,简洁就是美
/**
* Definition for singly-linked list.
* struct ListNode {
*
int val;
*
ListNode *next;
*
ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode head(0),*ptemp=&head;
int carrybit=0;
while(l1 || l2 || carrybit){
int add=(l1?l1->val:0)+(l2?l2->val:0)+carrybit;
ptemp->next=new ListNode(add%10);
ptemp=ptemp->next;
carrybit=add/10;
l1=l1?l1->next:l1;
l2=l2?l2->next:l2;
}
return head.next;
}
};
最后
以上就是怕孤单月光为你收集整理的leetcode 2: add two num 单向链表对应位相加的全部内容,希望文章能够帮你解决leetcode 2: add two num 单向链表对应位相加所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复