算法题[leetcode] 两数相加 python&java解法

leetcode算法题:两数相加 java&python解法

题目概述

在这里插入图片描述

解题思路

此题涉及到链表的一些知识,可以通过指针遍历链表来实现。核心问题是如何通过代码实现相加以及进位、如何将结果放进新的链表中。这些问题如果能解决,代码实现也就非常简单。

思路:

  1. 需要定义一个链表头节点来作为最终结果的输出;
  2. 需要定义一个指针不断指向当前需要插入的节点,来作为尾节点指针,实现结果数的链表。(此处参考链表的尾插法,向链表插入节点时,需要将节点插入到尾部,就让之前的尾节点的next指针指向当前插入的节点 )
  3. 遍历两个链表,通过 node = node.next 实现指针偏移
  4. 我们无法获知链表长度,所以采用while循环来实现链表遍历,我们可以同时去遍历两个链表,但可能会出现某一个链表遍历完了,另一个链表还有数据的情况。所以循环条件为两个链表某一个节点不为空就可以;
  5. 两数相加>9会进位1,加法不会存在进位>1的情况,所以可以采用0,1来代表本次相加的进位数字carry。所以同位相加的结果就是两个节点的val值相加再加上进位值。
  6. 创建一个新的节点,来存放相加的值。如果这是第一个节点,也就是最终结果的头节点,我们将定义的head指针指向这个节点。然后再将尾指针point也指向这个节点。如果不是第一个节点,我们将上次遍历的尾指针的next节点指向这个节点,然后再将尾指针也指向这个节点。
  7. 在此还需要考虑到,如果两个链表都遍历完了,但是最后后可能会有进位溢出,比如 99+10=109;百位的1就是溢出位,我们还是需要创建节点,将’1’也存进链表,所以我们此时的while循环条件还需要加上是否有进位溢出carry !=0 or carry =1.
  8. 最后返回头节点head的就ok;

java代码实现

public static class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }


    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //定义尾指针
        ListNode point = null;
        //定义是否进位标志
        int carry = 0;
        //定义最终返回的头指针
        ListNode head = null;
        //循环条件:
        //1. 节点不为空
        //2. 进位不为空 (可能会有节点为空,但还是有进位溢出)
        while (l1 != null || l2 != null || carry != 0) {
            //两个链表节点的值相加,并加上进位值
            int val = (l2 == null ? 0 : l2.val)+(l1 == null ? 0 : l1.val)+carry;
            //如果相加大于9 需要进位
            if (val> 9) {
                val -= 10;
                carry = 1;
            //无需进位
            } else {
                carry = 0;
            }
            //创建一个节点
            ListNode listNode = new ListNode(val);
            //节点向右偏移
            l1 = l1==null?null:l1.next;
            l2 = l2==null?null:l2.next;

            //如果第一个节点,则point==null 则第一次创建的节点为最终结果链表的头节点
            //如果不是第一个节点,类似头插法,将上一个节点的next指针指向此次节点
            if (point != null) {
                point.next = listNode;
            }else {
                head = listNode;
            }
            point = listNode;
        }
        return head;
    }

python代码实现

class ListNode(object):
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def addTwoNumbers(l1: ListNode, l2: ListNode)->ListNode:
    point: ListNode = None
    head: ListNode = None
    carry = 0
    while l1 is not None or l2 is not None or carry != 0:
        val = (0 if l1 is None else l1.val) + (0 if l2 is None else l2.val) + carry
        if val > 9:
            val -= 10
            carry = 1
        else:
            carry = 0
        list_node = ListNode(val)
        if l1 is not None:
            l1 = l1.next
        if l2 is not None:
            l1 = l1.next
        if point is not None:
            point.next = list_node
        else:
            head = list_node
        point = list_node
    return head
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值