解题思路
- 由于是逆序,所以一个链表从头到尾刚好是数的低位到高位,因此while循环来依次对相同位处理
- 如果有进位,则需要在下一位考虑进位
- 如果已经到了最高位,此时有进位数,则还需要开辟一个链表节点,否则就不用开辟了
小技巧:对于链表问题,返回结果为头结点时,通常需要先初始化一个预先指针 pre,该指针的下一个节点指向真正的头结点head。使用预先指针的目的在于链表初始化时无可用节点值,而且链表构造过程需要指针移动,进而会导致头指针丢失,无法返回结果。
代码
/**
* 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 pre = new ListNode(0);//哨兵节点 :新链表的伪头节点
ListNode cur = pre;
int carry = 0;//保存进位
while(l1 != null || l2 != null) {
int x = l1 == null ? 0 : l1.val;
int y = l2 == null ? 0 : l2.val;
int sum = x + y + carry;
carry = sum / 10;//求出进位
sum = sum % 10;//每个节点只保存一位,而且因为是逆序,所以保存的是低位
cur.next = new ListNode(sum);
cur = cur.next;
if(l1 != null){
l1 = l1.next;
}
if(l2 != null){
l2 = l2.next;
}
}
//到了最高位 还有进位 就要新建节点了
if(carry == 1) {
//注意,这里进位只可能是1,因为是两个个位数之和, 最大就是9+9=18,进位为1
//新建个节点保存进位值
cur.next = new ListNode(carry);
}
return pre.next;
}
}