Leetcode中Add Two Numbers算法的理解
来源:互联网 发布:结婚网络请柬 编辑:程序博客网 时间:2024/06/04 18:38
一、题目
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.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 ->0->8
二、分析与理解
本题主要是类似数据在机器中存储的方式,我们平常所见的数据比如342,在链表中是逆向存储的所以就成了2->4->3这样了,同样5 -> 6 -> 4就是465,如果这样转换后,我们就会发现342+465=807,在十位上相加是超过10向前进一,但是链表是逆向的,所以就是向后进一。
因此,本题可以把链表中的元素转换为相应的数据后进行相加,得到的结果在按照相应的格式放入链表中。也可以直接按照链表的方式进行相加,在相加的过程中判断其是否要进位,如果需要进位是向后进位的。
三、代码
链表结点ListNode的定义
//Definition for singly-linked list. public class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; } }} }
- 转换为相应数据的方式
public class Solution { //链表转数据long类型 public Long listToLong(ListNode l){ long num = 0; long curr =1; int i=0; while(l!=null){ num = num+l.val*curr; curr=curr*10; l=l.next; } return num; } //数据转链表 public ListNode longToList(Long num){ ListNode l3 = new ListNode(-1); l3.next = null; ListNode c = l3; c.val=(int)(num%10); num = num/10; while(num>0){ ListNode cnext = new ListNode((int)(num%10)); cnext.next=null; c.next=cnext; num = num/10; c=c.next; } return l3; } public ListNode addTwoNumbers(ListNode l1, ListNode l2) { if(l1==null&&l2==null){ return null; } //链表转long型 long num1 = listToLong(l1); long num2 = listToLong(l2); lonongToList(num下.里写代码片`.rn l3; } }
2.直接按照链表方式
直接用链表的方式去做有两种方式
一种递归的方式,代码如下:
public class Solution { public ListNode add(ListNode l1, ListNode l2, int carry){ if(l1==null && l2==null){ return carry == 0? null : new ListNode(carry); } if(l1==null && l2!=null){ l1 = new ListNode(0); } if(l2==null && l1!=null){ l2 = new ListNode(0); } int sum = l1.val + l2.val + carry; ListNode curr = new ListNode(sum % 10); curr.next = add(l1.next, l2.next, sum / 10); return curr; } public ListNode addTwoNumbers(ListNode l1, ListNode l2) { return add(l1,l2,0); }}
另一种迭代的方法
public class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode dummyHead = new ListNode(0); if(l1 == null && l2 == null){ return dummyHead; } int sum = 0, carry = 0; ListNode curr = dummyHead; while(l1!=null || l2!=null){ int num1 = l1 == null? 0 : l1.val; int num2 = l2 == null? 0 : l2.val; sum = num1 + num2 + carry; curr.next = new ListNode(sum % 10); curr = curr.next; carry = sum / 10; l1 = l1 == null? null : l1.next; l2 = l2 == null? null : l2.next; } if(carry!=0){ curr.next = new ListNode(carry); } return dummyHead.next; }}
阅读全文
0 0
- Leetcode中Add Two Numbers算法的理解
- 【LeetCode】算法题2 Add Two Numbers的归纳
- LeetCode算法题2:Add Two Numbers
- leetcode算法训练#2 Add Two Numbers
- LeetCode算法分析2.Add Two Numbers
- LeetCode算法--2、Add Two Numbers
- ACM之LeetCode中Add Two Numbers
- LeetCode: Add Two Numbers
- LeetCode: Add Two Numbers
- [LeetCode]Add Two Numbers
- LeetCode Add Two Numbers
- Leetcode: Add Two Numbers
- LeetCode : Add Two Numbers
- LeetCode Add Two Numbers
- [LeetCode] Add Two Numbers
- Leetcode : Add Two Numbers
- 【leetcode】Add Two Numbers
- [LeetCode]Add Two Numbers
- PHP float加减乘除
- Maven
- Spring Boot 1 . 简介
- hdu-4524-郑厂长系列故事——逃离迷宫-简单奇偶校检-java
- 设S是有n个元素的集合,S的幂集是S所有可能的子集组成的集合。
- Leetcode中Add Two Numbers算法的理解
- Python 中使用help()命令后如何退出
- Permutations
- ElasticSearch环境搭建
- zookeeper和dubbo的关系
- Java图形界面编程
- 【Tensorflow】你真的懂TensorFlow吗?Tensor是神马?为什么还会Flow?
- keras——函数式模型
- 学习记录:格式化字符串漏洞利用