题目
- 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
- 请你将两个数相加,并以相同形式返回一个表示和的链表。
- 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
节点类
public class ListNode {
int val;
ListNode next;
public ListNode() {
}
public ListNode(int val) {
this.val = val;
}
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
思路:
- 遍历两个链表,直接将他们的值相加,每次获得的值,即新链表的节点(大于10则取余后为新节点的val)。
- 这里需要注意的是:两数之和 > 10,需要向前进1。这里定义了count,用于接收 两数之和 / 10,下次循环时,count > 0,说明本次和满
- 10,进1了,sum 除了加两数之和,还要加count。
- 当两个链表都为null时,判断count的值,是否>0,>0则说明最后一次两数相加,超过了10,把count放入next节点
具体代码实现
public class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode p1 = l1;
ListNode p2 = l2;
ListNode head = new ListNode(0,null);
ListNode pre = head;
int count = 0;
while(p1 != null || p2 != null){
int sum = 0;
if(p1 != null){
sum += p1.val;
p1 = p1.next;
}
if(p2 != null){
sum += p2.val;
p2 = p2.next;
}
if(count != 0){
sum += count;
}
pre.next = new ListNode(sum % 10,null);
pre = pre.next;
count = sum / 10;
}
if(count > 0){
pre.next = new ListNode(count,null);
}
return head.next;
}
}
思路2
- 当链表长度不一时,用0去填充成一样长度,这样两值相加,结果不变。
- 这里没有虚拟头节点,直接使用头节点去串起链表
public class Solution1 {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode p1 = l1;
ListNode p2 = l2;
ListNode head = null;
ListNode pre = head;
int count = 0;
while(p1 != null || p2 != null){
int n1,n2;
if(p1== null){
n1 = 0;
}else{
n1 = p1.val;
}
if(p2== null){
n2 = 0;
}else{
n2 = p2.val;
}
int sum = n1 + n2 + count;
count = sum / 10;
ListNode temp = new ListNode(sum % 10,null);
if(head == null){
pre = temp;
head = pre;
}else{
pre.next = temp;
pre = pre.next;
}
if(p1 != null){
p1 = p1.next;
}
if(p2 != null){
p2 = p2.next;
}
}
if(count != 0){
pre.next = new ListNode(count,null);
}
return head;
}
}