两数相加求和
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; //返回新链表表头
}
}
python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class 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