leetCode2:两数相加(链表)

题目:

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

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

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

思路:

  • 遍历两个链表,逐位相加,还要加上进位。
  • 结果要存在链表里,所以一个 head 链表记住链表头, 另一个 tail 链表往后遍历,存储相加的结果。
  • 第一个链表的值,加上第二个链表的值,再加上进位值,就是结果链表的节点数值。
    int sum = x+y+add;
    new ListNode(sum%10) 通过实例化节点,设置结果链表的节点数值。
  • 两个链表,都要向后迭代,这样才能逐位相加。

代码:

 public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode head = null;
        ListNode tail = null;
        int add = 0;

        while (l1!=null || l2!=null) {
            int x =0;
            int y = 0;

            //思路:逐位相加,还要加上进位
            if (l1!=null) {
                x = l1.val;
            }
            if (l2!=null) {
                y = l2.val;
            }
		  //第一个链表的值,加上第二个链表的值,再加上进位值,就是结果
            int sum = x+y+add;

            if (head==null) {
                //head为null, 说明是刚开始遍历。 head 主要是用来记住结果的链表头
                // tail 也要初始化的
                // sum取余10,就是每一位的值
                tail = new ListNode(sum%10);
                head = tail;
            } else {
                //将相加的结果,放到 tail 里面。逐个填入
                tail.next = new ListNode(sum%10);
                //向后遍历
                tail = tail.next;
            }
            // sum除以10,就是要进位的值。
            add = sum/10;

            //两个链表,都要向后遍历
            if (l1!=null) {
                l1 = l1.next;
            }
            if (l2!=null) {
                l2 = l2.next;
            }

        }

        //最后,如果相加还有进位,要新建节点
        if ( add >0) {
            tail.next = new ListNode(add);
        }
        return head;



    }

posted on 2024-09-17 14:20  乐之者v  阅读(21)  评论(0)    收藏  举报

导航