2.两数相加 题目——链接 这题将两个val分开加到sum中更方便。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { /* 从前往后遍历链表,对应的结点乘以10的n次方 越高位越往后存,所以用尾插 */ //其中一个为空直接返回另一个 if(!l1) { return l2; } if(!l2) { return l1; } //初始化一个头结点(不存数据,最后将这个结点去掉了(return它的next)) ListNode* sumNode = new ListNode; sumNode->next = NULL; //用于尾插链接,保存定位当前链表的最后一个结点 ListNode* tempnode = NULL; int n = 0;//负责进一 //循环进入条件,如果1个不为空或者有1可进 while(l1 || l2 || n == 1) { //为每一位相加的结果创建新结点 ListNode* addNode = new ListNode; //如果l1和l2一样长,但是最后两个数相加能进一 if(!l1 && !l2) { addNode->val = n; tempnode->next = addNode; addNode->next = NULL; break; } //如果l2已经到头,但是l2没有 else if(!l2) { addNode->val = l1->val+n; if(addNode->val >= 10) { n = 1; addNode->val %= 10; } else { n = 0; } tempnode->next = addNode; addNode->next = NULL; tempnode = addNode; } //如果l1已经到头,但是l2没有 else if(!l1) { addNode->val = l2->val+n; if(addNode->val >= 10) { n = 1; addNode->val %= 10; } else { n = 0; } tempnode->next = addNode; addNode->next = NULL; tempnode = addNode; } else//两个都不为空 { addNode->val = l1->val + l2->val + n; n = 0; if(addNode->val >= 10) { n = 1; addNode->val %= 10; } } //根据题目结果来看,最后的和是通过尾插法插入到sumNode中的 //如果是第一次插入 if(!sumNode->next) { sumNode->next = addNode; addNode->next = NULL; //用于保存当前最后一个结点 tempnode = addNode; } else { //用于保存之前头结点后面的结点 tempnode->next = addNode; addNode->next = NULL; tempnode = addNode; } //判断条件,什么时候可以往后指 if(l1) { l1 = l1->next; } if(l2) { l2 = l2->next; } } //去掉第一个结点(直接返回sumNode->Next从第二个开始有数据的结点开始返回好像也行) // ListNode* deleHead = sumNode->next; // sumNode->val = sumNode->next->val; // sumNode->next = sumNode->next->next; // delete deleHead; return sumNode->next; }};