【初级算法】--2.两数相加

题目:
给出两个 非空 的链表用来表示两个非负的整数。
其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因: 2+5,4+6(需要往后进一位),3+4

首先需要定义一个链表结构的实体。

/**
 * 定义链表
 *
 * @author 天赋吉运-杨晓慧
 * @create 2019-02-26 20:48
 */

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

实现方式:

/**
 * @author 天赋吉运-杨晓慧
 * @create 2019-02-25 18:49
 */
public class addTwoNumbers {

    public static void main(String[] args) {
        ListNode nodel1 = new ListNode(2);
        ListNode nodel2 = new ListNode(4);
        ListNode nodel3 = new ListNode(6);
        nodel1.next = nodel2;
        nodel2.next = nodel3;

        ListNode noder1 = new ListNode(5);
        ListNode noder2 = new ListNode(6);
        ListNode noder3 = new ListNode(8);
        noder1.next = noder2;
        noder2.next = noder3;

        ListNode listNode = addTwoNumbers(nodel1, noder1);

        while (listNode.next!=null) {
            System.out.println(listNode.val);
            listNode =listNode.next;
            if (listNode.next == null) {
                System.out.println(listNode.val);
            }
        }
    }


    /**
     * 
     * @param l1 第一个链表
     * @param l2 第二个链表
     * @return 相加后的链表
     */
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 1.定义一个新的链表来存放相加合成之后的链表
        ListNode determinNode =new ListNode(0);
        // 2.分别定义三个数来表示 l1的当前节点,l2的当前节点,还有合起来的节点。
        ListNode p=l1,q=l2,curr=determinNode;
        int carry =0 ; // 将进位初始化为0
        // 3.循环l1和l2的三个节点,分别相加,注意往后进位
        while (p != null || q != null) {
             // 3.1 把当前循环到的p节点和q节点的val值赋给x和y
            int x= p!=null?p.val:0;
            int y= q!=null?q.val:0;
            // 3.2 x+y求和进位
            int sum = x + y +carry;
            carry= sum/10; // carry是进位值
            //  注意: sum跟10取余,算出来的是当前节点的值,这里要给到next,不然会每次都覆盖掉,最后输出也为空;
            curr.next = new ListNode(sum % 10);
            curr= curr.next;         // carr指向下一节点
            // 3.3 p和q节点往后移位
            if (p !=null) {
                p=p.next;
            }
            if (q !=null) {
                q=q.next;
            }

        }
        // 4.判断最后一次进位是否还大于0,大于0就拼到合并链表的最后一个
        if (carry>0) {
            curr.next = new ListNode(carry);
        }
        // 5.返回
        return determinNode.next;
    }
}

以上代码笔者已经过验证,读者阅后可以自行亲测,欢迎交流, 一起写高质量的代码。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页