2. 两数相加(高频题)


解题思路

  1. 由于是逆序,所以一个链表从头到尾刚好是数的低位到高位,因此while循环来依次对相同位处理
  2. 如果有进位,则需要在下一位考虑进位
  3. 如果已经到了最高位,此时有进位数,则还需要开辟一个链表节点,否则就不用开辟了

小技巧:对于链表问题,返回结果为头结点时,通常需要先初始化一个预先指针 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;
    }
}

文章作者: fFee-ops
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fFee-ops !
评论
  目录