Leetcode - Add Two Numbers

来源:互联网 发布:php printr 带格式化 编辑:程序博客网 时间:2024/06/06 01:13

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这种需要连续进位的情况

0 0
原创粉丝点击