给出两个非空的链表用来表示两个非负的整数。其中它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储一位数字。如果我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 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