【力扣刷题】第二题:两数相加

力扣第2题:两数相加

首先梳理加法流程:
看作三个链表相加,加数链表L1,被加数链表L2,进位链表LP,结果保存在LF链表中。
为进位链表初始化一个节点,val = 0
为结果链表新建一个节点LF
循环体{
处理L1和L2可能存在的空指针
LF.val = L1.val + L2.val + LP.val
若 LF < 10,为进位链表新建节点,val = 0
若 LF > 10,为进位链表新建节点,val = 1,LF.val = LF.val % 10
将L1,L2,LP,LF向后移动
}当L1或L2的非空时,继续循环,否则跳出

--解答错误
1. 结果链表后移时,需要根据实际情况判断是否新建节点,该题目数据结构,new节点不给val也会默认赋0
2. 跳出循环条件有问题,L1或L2非空继续循环,如果此时存在进位链表节点为1则代表存在进位,也应该继续循环

初版结果:

/**
 * 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 lf = new ListNode();
        ListNode lfHead = lf;
        ListNode lp = new ListNode(0);
        do {
            if (l1 == null) {
                l1 = new ListNode(0);
            }
            if (l2 == null) {
                l2 = new ListNode(0);
            }
            int lfVal = l1.val + l2.val + lp.val;
            if (lfVal < 10) {
                lp.next = new ListNode(0);
            } else {
                lfVal = lfVal % 10;
                lp.next = new ListNode(1);
            }
            lf.val = lfVal;
            if (l1.next != null || l2.next != null || lp.next.val == 1) {
                lf.next = new ListNode();
                lf = lf.next;
            }
            lp = lp.next;
            l1 = l1.next;
            l2 = l2.next;
        } while (l1 != null || l2 != null || lp.val == 1);
        return lfHead;
    }
}

 

--辛辛苦苦改了20分钟,可读性变高了,占用内存反而多了,焯!后面抄一个大佬的答案学一下。
提高可读性的版本:

/**
 * 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 lf = new ListNode();
        ListNode lfHead = lf;
        ListNode lp = new ListNode(0);
        //判断是否存在未处理的最高位
        while (l1 != null || l2 != null || lp.val == 1) {
            //处理该位数字
            int l1Val = l1 == null? 0: l1.val;
            int l2Val = l2 == null? 0: l2.val;
            int lfVal = (l1Val + l2Val + lp.val) % 10;
            int lpVal = (l1Val + l2Val + lp.val) < 10? 0: 1;
            lp.next = new ListNode(lpVal);
            lf.val = lfVal;
            //加数、被加数、进位链表指针后移
            lp = lp.next;
            l1 = (l1==null)? null: l1.next;
            l2 = (l2==null)? null: l2.next;
            //结果链表是否需要挂上新节点
            if (l1 != null || l2 != null || lp.val == 1) {
                lf.next = new ListNode();
                lf = lf.next;
            }
        }
        return lfHead;
    }
}

 

posted @ 2022-01-04 17:08  ProbablyTrue  阅读(59)  评论(0编辑  收藏  举报