2. 两数相加
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路: 刚开始很蠢的我居然一个一个读链表的数据,然后再相除,其实就一个每位直接加,然后设置进位为0,如果相加大于10,则进位为1,下面注释掉的坑就不用看了……
/**
* 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 l3(0);
ListNode *p1=l1;
ListNode *p2=l2;
ListNode *preNode=&l3;
//ListNode *preNode= (*ListNode)malloc(sizeof(ListNode));
int val1,val2,AddNumber=0;
while(p1!=NULL||p2!=NULL||AddNumber>0){ //最后一个条件很关键
ListNode *node=new ListNode(0);//定义临时的结构点,这个很重要
val1=p1?p1->val:0;
val2=p2?p2->val:0;
p1=p1?p1->next:NULL;//第一次执行的时候,忘记循环到下一步了
p2=p2?p2->next:NULL;
node->val=(val1+val2+AddNumber)%10;
AddNumber=(val1+val2+AddNumber)/10;
preNode->next=node;
preNode=preNode->next;
}
return l3.next;
// //定义新的链表l3
// ListNode l3(0);
// ListNode *p1=l1;
// ListNode *p2=l2;
// ListNode *p3=&l3;
// stack <int>s1;
// stack <int>s2;
// int num1=0;
// int num2=0;
// while(p1){
// s1.push(p1->val);
// p1=p1->next;
// }
// while(p2){
// s2.push(p2->val);
// p2=p2->next;
// }
// while(!s1.empty()){
// num1=num1*10+s1.top();
// s1.pop();
// }
// while(!s2.empty()){
// num2=num2*10+s2.top();
// s2.pop();
// }
// long num=num1+num2;
// if(num==0){
// ListNode *node=new ListNode(0);
// node->val=0;
// p3->next=node;
// }
// while(num){
// ListNode *node=new ListNode(0);//!!!!!本题做错的重点!!!
// int j=num%10;
// //没有结构体,要定义节点
// node->val=j;
// p3->next=node;
// p3=p3->next;
// num=(num-j)/10;
// }
// return l3.next;
}
//错误思路,先转化成整型,利用这种方式 当链表很长时,整型数字不能够表示。
};