1.题意理解
给定两个链表,每个链表表示两个非负整数,每个链表的每个结点都存放这个整数的一个数字,并且这些数字是以倒序排列的。要求将这两个整数相加并以链表的形式返回其结果。
例如:
输入 (2 -> 4 -> 3) + (5 -> 6 -> 4)
结果 7 -> 0 -> 8
2.网上参考算法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//如果l1或l2中有一个为null,则直接返回null结果
if (l1 == null || l2 == null)
return null;
int carry = 0; //表示进位
int digit = 0; //表示数字
ListNode head = null; //结果变量
ListNode point = head; //辅助变量
//算法开始
while (l1 != null && l2 != null) {
digit = (l1.val + l2.val + carry)%10;
carry = (l1.val + l2.val + carry)/10;
ListNode node = new ListNode(digit);
if (head == null)
head = node;
else
point.next = node;
point = node; //注意:不能写成 point = point.next;
l1 = l1.next;
l2 = l2.next;
}
//若l1中还有剩余元素,将其加入到结果head中
while (l1 != null) {
digit = (l1.val + carry)%10;
carry = (l1.val + carry)/10;
ListNode node = new ListNode(digit);
if (head == null)
head = node;
else
point.next = node;
point = node;
l1 = l1.next;
}
//若l2中还有剩余元素,将其加入到结果head中
while (l2 != null) {
digit = (l2.val + carry)%10;
carry = (l2.val + carry)/10;
ListNode node = new ListNode(digit);
if (head == null)
head = node;
else
point.next = node;
point = node;
l2 = l2.next;
}
//如果进位不为0,创建新的结点存放进位
if (carry != 0) {
ListNode node = new ListNode(carry);
point.next = node;
}
//返回结果
return head;
}
}
算法思路:该算法的主要思想为逐位相加,同时要注意维护进位,需要注意的是数字是逆序存放的。首先创建一个进位变量carry用来存放进位,算法开始之后,对两个链表的每一个元素依次相加,同时要加上进位,之后对相加后的结果分别进行取模运算与除法运算,取模运算得到的是结果链表相应位置的数字,除法运算得到的是进位值。当链表l1或l2中有一个链表遍历完成之后,将剩余的那一个链表加入到结果链表中,注意要和进位相加。
时间复杂度:O(n)