[Daily Practice] -链表两数相加

题目描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
该题目来源于leetcode,点击进入
链表如下:

public static class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }
    }

读题

示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

解题

从示例中可以看出,可以将此问题看做一个数学题来计算。此处应该注意的有三点:

  • 1、两个链表可能长度不一致
  • 2、可能存在链表为空
  • 3、可能出现额外的进位。比如 99 + 1 = 100

代码

public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		// 用于保存相加得到的结果 也用于最终返回 初始化为0
        ListNode retunList = new ListNode(0);
        ListNode p = l1, q = l2, curList = retunList;
        // carry 表示相加超过10后的进位数值
        int carry = 0;
        // 只要有一个链表还有值,那么就要将计算进行下去
        while (p != null || q != null) {
        	// 当链表存在空或者两个链表长度不一致时可能会出现空链表的情况,此时我们用0来与另一个链表相加
            int x = p == null ? 0 : p.val;
            int y = q == null ? 0 : q.val;
            // 计算结果应为链表对应节点的值加上进位的值
            int z = x + y + carry;
            // 重新对进位的值进行赋值
            carry = z / 10;
            // 该节点的值为相加后个位的值 如9 + 5 = 14 那么该位上的值应当为4,1需要进位
            curList.next = new ListNode(z % 10);
            // 对下一个节点进行计算
            curList = curList.next;
            if (p != null) p = p.next;
            if (q != null) q = q.next;
        }
        // 如果最终循环完成后还存在进位的值,应该向上进1位
        if (carry > 0) {
            curList.next = new ListNode(carry);
        }
        // 初始节点为0  所以返回的应该是它的next
        return retunList.next;
    }
发布了26 篇原创文章 · 获赞 6 · 访问量 2935

猜你喜欢

转载自blog.csdn.net/weixin_45676630/article/details/105180776