不适合当程序员

导航

LeetCode 第二题两数相加

题目:

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

例子

链表l1    : 4-->5-->6-->7-->8-->8

链表l2    : 2-->9-->2-->9

得到链表 : 6-->4-->9-->6-->9-->8

思路:就是链表简单的相加如同循环一样; 当时以为得到的链表时反序的,本以为的答案  8-->9-->6-->9-->4-->6

复习下数据结构链表:

别人家的孩子答案:

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 设置空节点首先,最终的添加数的方法
        ListNode head = null, tail = null;
        // 这是近位数
        int carry = 0;
        // 设置循环,如果双表都位空时说明已经结束了
        while (l1 != null || l2 != null) {
            // 双位运算符,说如果l1不等是空的话那他就是l1值如果位空那就是0
            int n1 = l1 != null ? l1.val : 0;
            // 双位运算符判断
            int n2 = l2 != null ? l2.val : 0;
            // 赋值技计算里面的内容
            int sum = n1 + n2 + carry;
            //判断下如果头为空和不为空判断,添加数据
            if (head == null) {
                head = tail = new ListNode(sum % 10);
            } else {
                tail.next = new ListNode(sum % 10);
            }
            //取10位上的值
            carry = sum / 10;
            //如同循环i++,
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }

        }
        // 这是为了如果双表都完成了没有值了但是还有进位值的时候要把进位值放到里面
        if (carry > 0) {
            tail.next = new ListNode(carry);
        }

        return head;

    }
}

class ListNode {
    int val;
    ListNode next;

    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }

    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

 

posted on 2021-10-18 11:41  趋近于零  阅读(33)  评论(0编辑  收藏  举报