2 - 两数相加 - python + Java

103 阅读2分钟

给出两个非空的链表用来表示两个非负的整数。其中它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储一位数字。如果我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

题目中给定的两个数以链表的形式表示,并且表示顺序为逆序。因此,我们可以直接从头遍历两个链表,分别取链表中节点对应的val相加,然后分别求商和余数。其中使用余数构建结果链表的新节点,商表示进位值,这里使用flag表示。不断的往后遍历,由于两个链表不一定长度相等,如果某刻链表对应的节点为null,那么可以将val看为0。最后,遍历完两个链表后还需要考虑flag是否为0,如果不为0,还需要将其作为新的节点添加到结果链表尾部。

整体的求解过程如下所示:


在这里插入图片描述

Java解题代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        if(l1 == null || l2 == null){
            return null;
        }

        int flag = 0;  // 进位
        ListNode head = new ListNode(-1);
        ListNode cur = head;
        while(l1 != null || l2 != null){
            int x = l1 != null ? l1.val : 0;
            int y = l2 != null ? l2.val : 0;

            int value = x + y + flag;
            int a = value % 10;  // 余数
            flag = value / 10;  // 商
            cur.next = new ListNode(a);
            cur = cur.next; 
            if(l1 != null){
                l1 = l1.next;
            }
            if(l2 != null){
                l2 = l2.next;
            }
        }

        // 判断最后进位的情况
        if(flag != 0){
            cur.next = new ListNode(flag);
        }

        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:
        if l1 is None or l2 is None:
            return None

        flag = 0
        head = ListNode(-1)
        cur = head
        while l1 or l2:
            x = l1.val if l1 else 0
            y = l2.val if l2 else 0
            value = x + y + flag
            a = value % 10
            flag = value // 10
            cur.next = ListNode(a)
            cur = cur.next
            if l1:l1 = l1.next
            if l2:l2 = l2.next

        if flag > 0:
            cur.next = ListNode(flag)

        return head.next