Leetcode - Add Two Numbers

Question

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

Java Code

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    int sum = 0, carry = 0;
    ListNode l1Temp = l1;
    ListNode l2Temp = l2;
    ListNode fatherNode = l1;

    while (l1Temp != null && l2Temp != null) {
        sum = l1Temp.val + l2Temp.val + carry;//计算对应节点和进位的总和
        l1Temp.val = sum % 10;//相加结果的个位,保存在l1链表中
        carry = sum / 10;//相加结果的十位,需要进位
        fatherNode = l1Temp;//记录l1Temp的前驱节点,当l1Temp为空时使用
        l1Temp = l1Temp.next;
        l2Temp = l2Temp.next;
    }

    if(l1Temp == null && l2Temp == null) {
        if(carry == 1)
            fatherNode.next = new ListNode(1);      
    }else if(l1Temp != null && l2Temp == null) {
        sum = l1Temp.val + carry;
        if(sum < 10) {
            l1Temp.val = sum;
        }else {
            //处理所有可能的相加结果的进位
            l1Temp.val = 0;             
            while(sum == 10) {              
                if(l1Temp.next != null) {
                    sum = l1Temp.next.val + 1;
                    l1Temp.next.val = sum % 10;
                    l1Temp = l1Temp.next;
                }else {
                    l1Temp.next = new ListNode(1);
                    break;
                }
            }
        }
    }else {
        fatherNode.next = l2Temp;//l1尾节点的后继节点指定为l2的下一个节点 
        sum = l2Temp.val + carry;
        if(sum < 10) {
            l2Temp.val = sum;
        }else {
            l2Temp.val = 0;
            while (sum == 10) {
                if(l2Temp.next != null) {
                    sum = l2Temp.next.val + 1;
                    l2Temp.next.val = sum % 10;
                    l2Temp = l2Temp.next;
                }else {
                    l2Temp.next = new ListNode(1);
                    break;
                }
            }
        }   
    }
    return l1;
}

说明

  • 这里需要有三层嵌套的if-else逻辑分支

    – 第1层,判断L1和L2链表哪个已经到达尾部,如果同时到达尾部这结束计算,否则进入下一层判断;

    – 第2层,判断较短链表的尾节点处相加结果是否有进位,如果无进位则结束计算,否则进入下一层判断;

    – 第3层,处理可能的连续进位时,判断最后一个节点是否有进位,如有则需要new一个ListNode,而且整个运算最多只需要new一个节点;

  • 第一个需要注意的坑是当next引用为空时,l1Temp = l1Temp.next;这句就不能再使用了,所以这里存储了一个fatherNode备用;

  • 相加结果直接存储在L1对应的节点中,如果L1比L2短,则将L1尾节点之后的结果保存在L2中,同时将L1尾节点指向当前的L2节点;

  • 尤其注意1 + 999这种需要连续进位的情况

你可能感兴趣的:(LeetCode,add,LinkedList)