题目
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
链接:两数相加
测例
- 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
- 输出:7 -> 0 -> 8
- 原因:342 + 465 = 807
思路
题目理解
从测例的原因中可以看出,题目是以链表形式倒序存储数字,有点类似以前做过的大数加法。
解题思路
直接按位相加,然后遍历寻找大于等于10的结点,向后进位。
易错点
- 两个链表长度不一定相等
- 链表末端可能出现0,需要删除
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode ans = new ListNode(0);
ListNode temp = ans;
int addans[] = new int[2];
while(l1 != null || l2 != null)
{
if(l1 != null)
{
temp.val = l1.val;
l1 = l1.next;
}
if(l2 != null)
{
temp.val += l2.val;
l2 = l2.next;
}
temp.next = new ListNode();
temp = temp.next;
}
temp = ans;
int add = 0;
while(temp != null)
{
temp.val += add;
add = 0;
if(temp.val > 9)
{
temp.val = temp.val % 10;
add = 1;
}
temp = temp.next;
}
temp = ans;
ListNode p = temp;
while(temp.next != null)
{
p = temp;
temp = temp.next;
}
if(temp.val == 0)
p.next = null;
return ans;
}
}
感想
第一次用java写这种题目,总想用指针和引用来做,太不习惯了。