LeetCode-Medium-Add Two Number

###Add Two Number
本来是一道非常简单的题目原题目的意思是,给两个链表,两个链表都链尾是十进制的头部
例如有链表形式 9->8->7 对应的十进制就是789,而后的操作时将两个链表相加并且合并到一个链表里面
###第一次的解法
我第一次是被结构体卡住了,才考研完,很多基础知识全忘了,比如构造函数,与函数的返回值以及传参的问题,导致自己被这个结构体卡了半天,所以第一个解法就没有用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;
 }
 
};

 

代码思想是,将每个链表对应的值,加到一个临时变量上,再通过临时变量对新节点进行赋值,在这时对劲新节点进行尾插法,因为考研复习了英语,所以注释都是英文,当然语法我都不在意了,我英语巨辣鸡仅限于我读得懂。(也是锻炼自己吧)。
posted @ 2020-01-03 20:34  Yekko  阅读(139)  评论(0编辑  收藏  举报