• 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 }
  • 相关阅读:
    JQ库函数记忆要点
    PHP运算符:算数运算符、逻辑运算符、三目运算符、位运算符、字符串运算符。
    ThinkPHP函数详解:F方法(快速缓存方法)
    AndroidStudio项目提交(更新)到github最详细步骤
    git项目管理及fatal: remote origin already exists.解决方法
    git项目管理及fatal: remote origin already exists.解决方法
    git分支(存在意义和使用方法)
    RecyclerView
    Git Windows版本
    chmod 777 -R on existing path getting chmod: -R: No such ...
  • 原文地址:https://www.cnblogs.com/Christal-R/p/9525464.html
Copyright © 2020-2023  润新知