原题描述
给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295 输出:2 -> 1 -> 9,即912示例:
输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295 输出:9 -> 1 -> 2,即912
思路
创建一个新的链表存储计算结果。
解题方法
1.前置知识1,链表的遍历;
ListNode node= head;
while (node!=null){
//操作node节点
node=node.next;
}
2.前置知识2,复制链表为新链表;
ListNode node= head;
//新链表的头节点 复制后的节点是 newDumy.next
ListNode newDumy = new ListNode(-1);
ListNode next=newDumy;
while (node!=null){
//操作node节点
ListNode newNode = new ListNode(node.val);
next.next=newNode;
//指向下一个节点
next=next.next;
node=node.next;
}
return newDumy.next;
3.求两个链表中相同节点值的和,如果链表已经为空,该节点的值为0。
//取链表中对应位数的值,链表为空则值为0
int s1 = l1!=null ? l1.val :0;
int s2 = l2!=null ? l2.val :0;
//求和 需要加上上一次计算的进位
int all = s1 + s2 + fort;
//是否需要进位
fort = all / 10;
//创建当前链表节点
ListNode node = new ListNode(all % 10);
//上个节点之前当前节点
pre.next=node;
//pre节点指向下一个节点
pre=pre.next;
4.两链表同时进入下一节点的计算
//两链表同时进入下一节点的计算
l1 = l1!=null ? l1.next :null;
l2 = l2!=null ? l2.next :null;
5.遍历结束,需要处理进位
//遍历结束,检查是否还有进位未处理
if (fort>0){
ListNode node = new ListNode(1);
pre.next=node;
}
复杂度
-
时间复杂度:O(n)
-
空间复杂度:O(n)
Code
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//进位
int fort =0;
//新建链表头部,保存两链表之和
ListNode head = new ListNode(0);
//记录上一个节点的值
ListNode pre=head;
//两链表为空 结束循环
while (l1!=null || l2 !=null) {
//取链表中对应位数的值,链表为空则值为0
int s1 = l1!=null ? l1.val :0;
int s2 = l2!=null ? l2.val :0;
//求和 需要加上上一次计算的进位
int all = s1 + s2 + fort;
// 是否需要进位
fort = all / 10;
//创建当前链表节点
ListNode node = new ListNode(all % 10);
//上个节点之前当前节点
pre.next=node;
//pre节点指向下一个节点
pre=pre.next;
//两链表同时进入下一节点的计算
l1 = l1!=null ? l1.next :null;
l2 = l2!=null ? l2.next :null;
}
//遍历结束,检查是否还有进位未处理
if (fort>0){
ListNode node = new ListNode(1);
pre.next=node;
}
return head.next;
}
}