C++实现LeetCode(2.两个数字相加)

作者:Grandyang 时间:2023-06-23 16:51:11 

[LeetCode] 2. Add Two Numbers 两个数字相加

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Example:

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
Explanation: 342 + 465 = 807.

这道并不是什么难题,算法很简单,链表的数据类型也不难,就是建立一个新链表,然后把输入的两个链表从头往后撸,每两个相加,添加一个新节点到新链表后面。为了避免两个输入链表同时为空,我们建立一个 dummy 结点,将两个结点相加生成的新结点按顺序加到 dummy 结点之后,由于 dummy 结点本身不能变,所以用一个指针 cur 来指向新链表的最后一个结点。好,可以开始让两个链表相加了,这道题好就好在最低位在链表的开头,所以可以在遍历链表的同时按从低到高的顺序直接相加。while 循环的条件两个链表中只要有一个不为空行,由于链表可能为空,所以在取当前结点值的时候,先判断一下,若为空则取0,否则取结点值。然后把两个结点值相加,同时还要加上进位 carry。然后更新 carry,直接 sum/10 即可,然后以 sum%10 为值建立一个新结点,连到 cur 后面,然后 cur 移动到下一个结点。之后再更新两个结点,若存在,则指向下一个位置。while 循环退出之后,最高位的进位问题要最后特殊处理一下,若 carry 为1,则再建一个值为1的结点,代码如下:

C++ 解法: 


class Solution {
public:
   ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
       ListNode *dummy = new ListNode(-1), *cur = dummy;
       int carry = 0;
       while (l1 || l2) {
           int val1 = l1 ? l1->val : 0;
           int val2 = l2 ? l2->val : 0;
           int sum = val1 + val2 + carry;
           carry = sum / 10;
           cur->next = new ListNode(sum % 10);
           cur = cur->next;
           if (l1) l1 = l1->next;
           if (l2) l2 = l2->next;
       }
       if (carry) cur->next = new ListNode(1);
       return dummy->next;
   }
};

Java 解法:


public class Solution {
   public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
       ListNode dummy = new ListNode(-1);
       ListNode cur = dummy;
       int carry = 0;
       while (l1 != null || l2 != null) {
           int d1 = l1 == null ? 0 : l1.val;
           int d2 = l2 == null ? 0 : l2.val;
           int sum = d1 + d2 + carry;
           carry = sum >= 10 ? 1 : 0;
           cur.next = new ListNode(sum % 10);
           cur = cur.next;
           if (l1 != null) l1 = l1.next;
           if (l2 != null) l2 = l2.next;
       }
       if (carry == 1) cur.next = new ListNode(1);
       return dummy.next;
   }
}

在 CareerCup 上的这道题还有个 Follow Up,把链表存的数字方向变了,原来是表头存最低位,现在是表头存最高位,请参考另一篇文档 2.5 Add Two Numbers 两个数字相加 。

来源:https://www.cnblogs.com/grandyang/p/4129891.html

标签:C++,LeetCode,两个数字相加
0
投稿

猜你喜欢

  • Java 判断实体对象及所有属性是否为空的操作

    2022-12-06 14:32:07
  • Android自定义ScrollView实现放大回弹效果实例代码

    2022-10-15 11:00:58
  • Android Room数据库多表查询的使用实例

    2022-11-07 02:49:49
  • SpringBoot+WebSocket实现消息推送功能

    2021-11-15 12:16:18
  • android自定义进度条渐变圆形

    2022-07-15 02:04:14
  • C# using的本质及使用详解

    2022-10-10 06:11:23
  • Android实现TCP断点上传 后台C#服务接收

    2023-08-25 22:24:00
  • Java中SpringSecurity密码错误5次锁定用户的实现方法

    2021-07-10 10:38:17
  • Android Mms之:对话与联系人关联的总结详解

    2023-12-06 13:12:57
  • Android同步屏障机制sync barrier实例应用详解

    2023-04-24 05:27:04
  • Android 7.0以上版本实现应用内语言切换的方法

    2022-12-21 00:25:31
  • Android ActionBar搜索功能用法详解

    2023-01-24 21:15:02
  • C#微信开发第一章

    2022-02-14 19:16:31
  • C#算法之无重复字符的最长子串

    2021-05-24 21:56:59
  • vscode设置Fira_Code字体及改变编辑器字体、背景颜色的代码详解

    2023-05-22 21:00:17
  • Android WebView与JS交互全面详解(小结)

    2023-12-04 03:10:59
  • Java 添加和删除PDF图层的示例代码

    2022-09-03 00:29:01
  • C#调用易语言写的Dll文件方法

    2023-07-21 01:56:10
  • C#使用udp如何实现消息的接收和发送

    2022-05-26 20:56:01
  • android使用viewpager计算偏移量实现选项卡功能

    2023-12-06 12:53:02
  • asp之家 软件编程 m.aspxhome.com