题目:
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原理:342 + 465 = 807
解题思路:
- 遍历两个链表
- 按链表的数据元素的顺序对两个数字相加,10为除数,商为进位,余数为新链表当前位置的数据
- 还要考虑相加是否会进位
注意空指针问题。
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 list = new ListNode(0); //初始化链表
ListNode current = list; //指向当前节点
int add = 0; //需要进位的值
while ((l1 != null) || (l2 != null)) {
if (l1 != null) {
add += l1.val;
l1 = l1.next;
}
if (l2 != null) {
add += l2.val;
l2 = l2.next;
}
current.next = new ListNode(add % 10); //将当前数插入链表尾部
add /= 10;
current = current.next; //修改当前指向的节点
}
if (add > 0) {
current.next = new ListNode(add);
//add大于0及最后两数相加大于等于10向前进一位
}
return list.next;
}
}
C++
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode list(0),*current = &list;
int add = 0;
while (add || (l1!= nullptr) || (l2!=nullptr)) {
//注意判断顺序
if (l1 != nullptr)
add += l1->val;
l1 = l1 ? l1->next : nullptr;
//注意:l1可能是nullptr
if (l2 != nullptr)
add += l2->val;
l2 = l2 ? l2->next : nullptr;
current->next = new ListNode(add%10);
add /= 10;
current = current->next;
}
if(add>0)
current->next = new ListNode(add);
return list.next;
}
};
PHP
class Solution {
/**
* @param ListNode $l1
* @param ListNode $l2
* @return ListNode
*/
function addTwoNumbers($l1, $l2) {
$list = new ListNode(0); //初始化链表
$current = $list; //指向当前节点
$add = 0; //需要进位的值
while($l1 || $l2){
$l1v = $l1->val != null ? $l1->val : 0;
$l2v = $l2->val != null ? $l2->val : 0;
$val = ($l1v + $l2v + $add) % 10;
$add = intval(($l1v + $l2v + $add) / 10);
$current->next = new ListNode($val); //将当前数插入链表尾部
$current = $current->next; //修改当前指向的节点
if($l1 != null){
$l1 = $l1->next;
}
if($l2 != null){
$l2 = $l2->next;
}
}
if($add > 0){
$current->next = new ListNode($add);
//add大于0及最后两数相加大于等于10向前进一位
}
return $list->next;
}
}
Python3
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
list = ListNode(0)
current = list
add = 0
while(l1 or l2):
l1v = l1.val if l1 else 0
l2v = l2.val if l2 else 0
val = (l1v+l2v+add)%10
add = (l1v+l2v+add)//10
current.next = ListNode(val)
current = current.next
if(l1!=None):
l1=l1.next
if(l2!=None):
l2=l2.next
if(add>0):
current.next=ListNode(add)
return list.next