【LeetCode】[0002] 【两数之和】

题目描述

  给出两个非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
【示例】
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

思路分析

最好设置一个头结点,然后设置两个指针分别指向两个链表的头,要考虑到进位,

测试用例

  1. 功能测试:
    l1=[0,1],l2=[0,1,2] 当一个列表比另一个列表长时
  2. 特殊链表测试:
    l1=[],l2=[0,1]
    l1=[9,9],l2=[1] //会有进位

Java代码

public class TOP002 {

    public static void main(String[] args) {
        System.out.println("****功能测试***");
        test1();
        System.out.println("****边界测试****");
        test2();
        System.out.println("****边界测试****");
        test3();
    }

    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        return Solution1(l1, l2);
    }

    /**
     * 方法一: 思路:设置头结点,设置两个指针分别指向两个链表的头,
     * 
     * @param l1
     * @param l2
     * @return
     */
    private static ListNode Solution1(ListNode l1, ListNode l2) {
        ListNode head = new ListNode(0);
        ListNode curr = head;
        int overbit = 0;// 进位
        ListNode p = l1, q = l2;
        while (p != null || q != null) {
            int x = (p != null) ? p.val : 0;
            int y = (q != null) ? q.val : 0;
            int sum = x + y + overbit;
            overbit = sum / 10;
            curr.next = new ListNode(sum % 10);
            curr = curr.next;
            if (p != null)
                p = p.next;
            if (q != null)
                q = q.next;
        }
        if (overbit > 0) {
            curr.next = new ListNode(overbit);
        }
        return head.next;
    }

    /**
     * 方法二:
     * 
     * @param l1
     * @param l2
     * @return
     */
    private static ListNode Solution2(ListNode l1, ListNode l2) {
        ListNode head = new ListNode(0);// 构造一个头结点
        ListNode curr = head; // 表示当前节点
        int carry = 0;// 进位
        int ans;// 用于存储相加进位之后 当前位结果
        while (l1 != null || l2 != null) {
            ans = carry;
            if (l1 != null) {
                ans += l1.val;
                l1 = l1.next;
            }
            if (l2 != null) {
                ans += l2.val;
                l2 = l2.next;
            }
            if (ans > 9) {
                carry = 1;
                ans -= 10;
            } else {
                carry = 0;
            }
            curr.next = new ListNode(ans);
            curr = curr.next;
        }
        if (carry != 0) {
            curr.next = new ListNode(1);
        }
        return head.next;
    }

    /**
     * 功能测试
     * 
     * l1=[0,1],l2=[0,1,2]
     * 
     */
    private static void test1() {
        ListNode l10 = new ListNode(0);
        ListNode l11 = new ListNode(1);
        l10.next = l11;
        System.out.println("链表l1");
        ListNode.printListNode(l10);
        
        ListNode l20 = new ListNode(0);
        ListNode l21 = new ListNode(1);
        ListNode l22 = new ListNode(2);
        l20.next = l21;
        l21.next = l22;
        System.out.println("链表l2");
        ListNode.printListNode(l20);
        
        ListNode sum = addTwoNumbers(l10, l20);
        System.out.println("两数相加结果:");
        ListNode.printListNodeWithHead(sum);
    }
    
    /**
     * 边界测试
     * l1=[9,9],l2=[1]
     */
    private static void test2() {
        ListNode l10 = new ListNode(9);
        ListNode l11 = new ListNode(9);
        l10.next = l11;
        System.out.println("链表l1");
        ListNode.printListNode(l10);
        
        ListNode l20 = new ListNode(1);
        
        System.out.println("链表l2");
        ListNode.printListNode(l20);
        
        ListNode sum = addTwoNumbers(l10, l20);
        System.out.println("两数相加结果:");
        ListNode.printListNode(sum);
    }
    
    
    /**
     * 边界测试
     * l1=[9,9],l2=[1]
     */
    private static void test3() {
        ListNode l10 = null;
        System.out.println("链表l1");
        ListNode.printListNode(l10);
        
        ListNode l20 = new ListNode(0);
        ListNode l21 = new ListNode(1);
        l20.next  = l21;
        System.out.println("链表l2");
        ListNode.printListNode(l20);
        
        ListNode sum = addTwoNumbers(l10, l20);
        System.out.println("两数相加结果:");
        ListNode.printListNode(sum);
    }
}

代码链接

LeetCode-Java

转载于:https://www.cnblogs.com/haoworld/p/leetcodetop2-liang-shu-zhi-he.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值