总接受:151227总提交:638158困难:中等
给你两个链表表示两个非负数字。数字以相反的顺序存储链表中,每个节点代表数字的一位。
相加两个链表代表的数字并返回一个链表。
输入:(2 - > 4 - > 3)+(5 - > 6 - > 4)
输出:7 - > 0 - > 8
分析:
朴素的模拟思想,先相加(从链表头,低位),再进位即可,基础代码编写能力!
空间复杂度为O(N),时间复杂度为O(N)
N是两个链表的较长者
/**
* 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) {
//于2016.6.10徒手重写
int val1=0;
int val2=0;
int carry=0;
ListNode* head=new ListNode(0);
ListNode* move=head;
bool flagfirst=true;
while(l1!=NULL || l2!=NULL)
{
val1=0;
if(l1!=NULL)
{
val1=l1->val;
l1=l1->next;
}
val2=0;
if(l2!=NULL)
{
val2=l2->val;
l2=l2->next;
}
if(flagfirst)
{
flagfirst=false;
head->val= (val1+val2+carry)%10;
carry=(val1+val2+carry)/10;
}else{
ListNode* newnode=new ListNode(0);
newnode->val=(val1+val2+carry)%10;
carry=(val1+val2+carry)/10;
move->next=newnode;
move=newnode;
}
}
if(carry)
{
ListNode* newnode=new ListNode(carry);
move->next=newnode;
}
return head;
}
};
别人的算法:
(思路一样!)
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int carry = 0;
ListNode* head = new ListNode(0);
ListNode* curNode = head;
while(l1 != NULL || l2 != NULL){
int val1 = 0;
if(l1 != NULL){ //来自链表1的值
val1 = l1->val;
l1 = l1->next;
}
int val2 = 0;
if(l2 != NULL){ //来自链表2的值
val2 = l2->val;
l2 = l2->next;
}
int value = val1 + val2 + carry;
ListNode* newNode= new ListNode(value % 10);
curNode->next = newNode;
carry = value / 10; //进位
curNode = curNode->next;
}
if(carry > 0)
curNode->next = new ListNode(carry);
return head->next;
}
};
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/50488439
原作者博客:http://blog.csdn.net/ebowtang