zoukankan      html  css  js  c++  java
  • LeetCode之Add Two Numbers

    Add Two Numbers

    方法一:

      考虑到有进位的问题,首先想到的思路是:

      先分位求总和得到 totalsum,然后再将totalsum按位拆分转成链表;

     1 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
     2         int sum = 0;
     3         int i = 1;
     4         while(l1 != NULL && l2 != NULL)
     5         {
     6             sum += i*(l1->val + l2->val);
     7             i *= 10;
     8             l1 = l1->next;
     9             l2 = l2->next;
    10         }
    11         while(l1 != NULL)
    12         {
    13             sum += i * (l1->val);
    14             i *= 10;
    15             l1 = l1->next;
    16         }
    17         while(l2 != NULL)
    18         {
    19             sum += i * (l2->val);
    20             i *= 10;
    21             l2 = l2->next;
    22         }
    23         //fen
    24         ListNode *head = new ListNode(0);
    25         ListNode *p = head;
    26         if(sum == 0) return head;
    27         while(sum!=0)
    28         {
    29           p->next = new ListNode(sum%10);
    30           p = p->next;
    31           sum /= 10;
    32         }
    33         return head->next;
    34     }

      修修改改总算是通过了基本测试,但并不是100%通过;

      这就奇怪了,为什么运算得好好的,遇到这组测试就偏偏出了问题。输出中间结果一看,才知道是 int 型溢出了。因此将变量 sum 和变量 i 都从int型换成 long long 型。这下总该行了吧?

      没想到呀,还有更长的测试数据。

      静下心来想一想,既然输入的数据是链表的形式,必然会有超过 long long 长度的情况。此解决方案存在巨大的隐患!!!

    方法二:

      换一种思维方式,只需要关注同等位的相加,进位1或者不进位。问题很简单嘛,同等位相加加入到新链表中,若有进位则记录到下次同等位的相加中....

     1 ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
     2         ListNode *head = new ListNode(0);
     3         ListNode *p = head;
     4         int sum = 0;
     5         while(l1 != NULL || l2 != NULL)
     6         {
     7             if(l1 != NULL)
     8             {
     9                 sum += (l1->val);
    10                 l1 = l1->next;
    11             }
    12             if(l2 != NULL)
    13             {
    14                 sum += (l2->val);
    15                 l2 = l2->next;
    16             }
    17             p->next = new ListNode(sum%10);
    18             p = p->next;
    19             sum /= 10;
    20         }
    21         if(sum != 0)
    22             p->next = new ListNode(sum);
    23         return head->next;
    24     }

     基础补充

      回顾下链表的创建个输出,以头结点不存内容为例。

    1、链表的创建:

     1 ListNode* CreatList()
     2 {
     3   ListNode *head = new ListNode(0);
     4   ListNode *p = head;
     5   int x = 1;
     6   while(1)
     7   {
     8     cin>>x;
     9     if(x == -1)
    10       break;
    11     p->next = new ListNode(x);
    12     p = p->next;
    13   }
    14   return head;
    15 }

    2、打印链表:

     1 void PrintList(ListNode *head)
     2 {
     3   ListNode* p = head;
     4   while(p->next!=NULL)
     5   {
     6     p = p->next;
     7     cout<<p->val<<"->";
     8   }
     9   cout<<endl;
    10 }
  • 相关阅读:
    windows下安装nginx
    java 32位MD5加密的大写字符串
    eclipse运行maven的jetty插件内存溢出
    Phpstorm Alt+Enter 自动导入类
    CSS 再学习,文本处理
    1406 data too long for column 'content' at row 1
    tp5.1报错 页面错误!请稍后再试
    lnmp升级php
    Tp5,Service使用
    CSS再学习 之背景色 背景图片
  • 原文地址:https://www.cnblogs.com/Christal-R/p/9525464.html
Copyright © 2011-2022 走看看