博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode之Add Two Numbers
阅读量:5147 次
发布时间:2019-06-13

本文共 2429 字,大约阅读时间需要 8 分钟。

方法一:

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

  先分位求总和得到 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         //fen24         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<
val<<"->"; 8 } 9 cout<

 

转载于:https://www.cnblogs.com/Christal-R/p/9525464.html

你可能感兴趣的文章
DOM节点类型
查看>>
初识socket
查看>>
Hive(二)hive的基本操作
查看>>
[笔记] SQL性能优化 - 常用语句(一)
查看>>
openvino安装踩坑记
查看>>
html03
查看>>
LINQ语法详解
查看>>
The folder is already a source folder
查看>>
App 组件化/模块化之路——Android 框架组件(Android Architecture Components)使用指南
查看>>
Java里的日期和时间学习
查看>>
securecrt 上传下载
查看>>
公共技术点之 Java 反射 Reflection
查看>>
DICOM:DICOM3.0网络通信协议
查看>>
免费好用的web应用托管平台-续
查看>>
分享:FIFO 同步、异步以及Verilog代码实现
查看>>
二分查找算法
查看>>
《构建之法》读书笔记2
查看>>
enum 枚举一般用法 dotnet
查看>>
SVM理解
查看>>
ReportServer Tutorial
查看>>