两数相加求和
1、问题描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
2、问题分析
对于这个问题,大家第一步想到的肯定是遍历链表,把整数取出来然后相加,再把和转换成链表。我最开始想到的一种方法是分别遍历链表,获取链表长度。假设长度为n,h1=v0x10^0 +… vnx10^n,同理求出第二个整数h2。然后还要把求到的结果返回到链表,这种方式显然太过麻烦。
其实,关于两个整数求和,如果把问题归到每个位上的数相加,只要判断是否进位就可以了。按照逻辑来说本来两个数相加应该向左进位,又因为该链表以逆序的方式存储它的位数,所以向右进位即可。
比如 2 4 3 + 5 6 4
2+5 =7 , 7<10(7/10=0),没有发生进位,直接相加即可,结果是7%10 为7
4+6 =10 ,10>=10(10/10=1) ,向右发生进位,保留进位后的数字,结果是10%10 为0
3+4+1=8, 8<10,由于上面发生进位所以这里加1 ,结果为8
3、代码
java
/**
* Definition for singly-linked list.
* public class ListNode {
*int val;
*ListNode next;
*ListNode(int x) { val = x;
}
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = new ListNode(0);
//创建求和后的空链表
ListNode temp = head;
//temp起到指针的作用,用来遍历链表
int flag = 0;
//如果进位则为1,否则为0
while(l1 != null || l2 !=null || flag !=0){
int v1 = l1 != null?l1.val : 0;
int v2 = l2 != null?l2.val : 0;
int sum = v1+v2+flag;
flag = sum/10;
//判断是否发生进位ListNode sn = new ListNode(sum % 10);
temp.next = sn;
//把保存和值的节点赋值给空链表的下个节点
temp = sn;
//指针指向所求链表的下一个链表
if(l1 != null) l1 = l1.next;
//l1节点向右移动一位
if(l2 != null) l2 = l2.next;
//l2节点向右移动一位}
return head.next;
//返回新链表表头
}
}
【Leetcode刷题链表之两数相加求和(java、python)】python
# Definition for singly-linked list.
# class ListNode:
#def __init__(self, x):
#self.val = x
#self.next = Noneclass Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
head = ListNode(0)
temp = head
flag = 0
while(l1 or l2 or flag!=0):
if(l1) :v1=l1.val
else :v1=0
if(l2) :v2=l2.val
else :v2=0
sum = v1+v2+flag
flag = sum//10//取整用//
sn = ListNode(sum%10)
temp.next = sn
temp = sn
if(l1!=None):l1=l1.next
if(l2!=None):l2=l2.next
return head.next
推荐阅读
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- 数据结构和算法|LeetCode 的正确使用方式
- 先序遍历 中序遍历 后序遍历 层序遍历
- 数据结构|C++技巧(用class类实现链表)
- 数据结构|贪吃蛇代码--c语言版 visual c++6.0打开
- 算法|算法-二分查找
- 数据结构学习指导|数据结构初阶(线性表)
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- java|ObjectOrientedProgramming - 面向对象的编程(多态、抽象类、接口)- Java - 细节狂魔