Leetcode刷题链表之两数相加求和(java、python)

两数相加求和

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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值