LeetCode-Medium-Add Two Number
###Add Two Number
本来是一道非常简单的题目原题目的意思是,给两个链表,两个链表都链尾是十进制的头部
例如有链表形式 9->8->7 对应的十进制就是789,而后的操作时将两个链表相加并且合并到一个链表里面
本来是一道非常简单的题目原题目的意思是,给两个链表,两个链表都链尾是十进制的头部
例如有链表形式 9->8->7 对应的十进制就是789,而后的操作时将两个链表相加并且合并到一个链表里面
###第一次的解法
我第一次是被结构体卡住了,才考研完,很多基础知识全忘了,比如构造函数,与函数的返回值以及传参的问题,导致自己被这个结构体卡了半天,所以第一个解法就没有用leetcode给的结构体,而是自己的结构体,显然是不会通过leetcode只是为了自己理清思路。
我第一次是被结构体卡住了,才考研完,很多基础知识全忘了,比如构造函数,与函数的返回值以及传参的问题,导致自己被这个结构体卡了半天,所以第一个解法就没有用leetcode给的结构体,而是自己的结构体,显然是不会通过leetcode只是为了自己理清思路。
//LeetCode struct struct ListNode{ int val; ListNode *next; ListNode(int x):val(x),next(nullptr){} }; //my self struct struct ListNode{ int val; ListNode *next; };
可以看到两个结构体其实就是一个构造函数的区别,一个是要在初始化时通过显式构造函数,一个是默认构造函数,而我这个二五仔居然一开始没想起来。
下面贴出实现代码(太过冗长)
下面贴出实现代码(太过冗长)
class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode *p = l1; ListNode *q = l2;//equation int len1 = 0, len2 = 0, temp = 0; int Maxlen = 0, Minlen = 0; while (p->next!=nullptr) { p = p->next; ++len1; } while (q->next!=nullptr) { q= q->next; ++len2; }//find length of the linklist p = l1->next; q = l2->next; if (len1 >= len2) { Maxlen = len1; Minlen = len2; while (Minlen--) { temp = p->val + q->val; if (temp >= 10) { p->val = temp % 10; if (p->next == nullptr) { ListNode *s = new ListNode; p->next = s; p = s; p->val = 1; p->next = nullptr; q = q->next; } else { p = p->next; ++p->val; q=q->next; } } else { p->val = temp; p = p->next; q = q->next; } } return l1; } else if (len1 <len2) { Maxlen = len2; Minlen = len1; while (Minlen--) { temp = p->val + q->val; if (temp >= 10) { q->val = temp % 10; if (p->next == nullptr) { ListNode *s = new ListNode; q->next = s; q = s; q->val = 1; q->next = nullptr; p = p->next; } else { q = q->next; ++q->val; p = p->next; } } else { q->val = temp; p = p->next; q = q->next; } } return l2; } } ``` 这第一次的代码真的是又臭又长,我通过判断当前的链表长度,然后再依据长度来进行主链表的加法,真的是又臭又长,完全没想到利用链表本身的特性,即遍历到尾节点后遇到空就可以用判断语句停止。真的跟猪一样我。 于是痛定思痛,手写了一下代码,再去看了下优秀的代码就清爽多了(手写代码真的很不错) ```cpp class Solution { public: ListNode* addTwoNumbers(ListNode* L1, ListNode* L2) { ListNode preHead(0); ListNode *p = &preHead; int extra = 0; while (L1 || L2 || extra) { if (L1) { extra += L1->val; L1 = L1->next; } if (L2) { extra += L2->val; L2 = L2->next; }//two Link try to add self value to extra,in order to soon afterwards compile p->next =new ListNode(extra % 10); extra = extra / 10; p = p->next; //above three procedure already complete pastorder insert; } return preHead.next; } };
代码思想是,将每个链表对应的值,加到一个临时变量上,再通过临时变量对新节点进行赋值,在这时对劲新节点进行尾插法,因为考研复习了英语,所以注释都是英文,当然语法我都不在意了,我英语巨辣鸡仅限于我读得懂。(也是锻炼自己吧)。