leetcode算法题:两数相加 java&python解法
题目概述
解题思路
此题涉及到链表的一些知识,可以通过指针遍历链表来实现。核心问题是如何通过代码实现相加以及进位、如何将结果放进新的链表中。这些问题如果能解决,代码实现也就非常简单。
思路:
- 需要定义一个链表头节点来作为最终结果的输出;
- 需要定义一个指针不断指向当前需要插入的节点,来作为尾节点指针,实现结果数的链表。(此处参考链表的尾插法,向链表插入节点时,需要将节点插入到尾部,就让之前的尾节点的next指针指向当前插入的节点 )
- 遍历两个链表,通过 node = node.next 实现指针偏移。
- 我们无法获知链表长度,所以采用while循环来实现链表遍历,我们可以同时去遍历两个链表,但可能会出现某一个链表遍历完了,另一个链表还有数据的情况。所以循环条件为两个链表某一个节点不为空就可以;
- 两数相加>9会进位1,加法不会存在进位>1的情况,所以可以采用0,1来代表本次相加的进位数字carry。所以同位相加的结果就是两个节点的val值相加再加上进位值。
- 创建一个新的节点,来存放相加的值。如果这是第一个节点,也就是最终结果的头节点,我们将定义的head指针指向这个节点。然后再将尾指针point也指向这个节点。如果不是第一个节点,我们将上次遍历的尾指针的next节点指向这个节点,然后再将尾指针也指向这个节点。
- 在此还需要考虑到,如果两个链表都遍历完了,但是最后后可能会有进位溢出,比如 99+10=109;百位的1就是溢出位,我们还是需要创建节点,将’1’也存进链表,所以我们此时的while循环条件还需要加上是否有进位溢出carry !=0 or carry =1.
- 最后返回头节点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