#leetcode刷题之路2-两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
#include <iostream> struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}//构造函数 }; ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode *ans = new ListNode(0);//避免这是个空指针 ListNode *temp=ans;//temp来帮ans做后面的拼接工作 int sum=0; while (l1||l2) { if(l1){ sum+=l1->val; l1=l1->next; } if(l2){ sum+=l2->val; l2=l2->next; } temp->next=new ListNode(sum%10); sum/=10; temp=temp->next; } if(sum)//如果还有值说明最高位还有数所以要加1 temp->next=new ListNode(1); return ans->next; } void InitList(ListNode *&head,int n) { std::cout << "开始赋值"<< std::endl; ListNode *p,*s; head=(ListNode*)malloc(sizeof(ListNode)); head->next= nullptr; p=head; for(int i=1;i<=n;i++) { s=(ListNode*)malloc(sizeof(ListNode)); scanf("%d",&(s->val)); s->next=nullptr; p->next=s; p=p->next; } } int main() { ListNode *l1,*l2; InitList(l1,3); InitList(l2,3); // while (l1 != nullptr) // { // std::cout << l1->val << std::endl; // l1 = l1->next; // } // cout << endl; // while (l2 != nullptr) // { // std::cout << l2->val << std::endl; // l2 = l2->next; // } // cout << endl; l1 = l1->next; l2 = l2->next; ListNode *ans=addTwoNumbers( l1, l2); while(ans!= nullptr) { std::cout << ans->val << std::endl; ans=ans->next; } return 0; }
链表还是要好好练练啊