2_两数相加

简介: 2_两数相加

2_两数相加

 

package 链表;
/**
 * https://leetcode-cn.com/problems/add-two-numbers/
 * 
 * @author Huangyujun
 */
public class _2_两数相加 {    
// 题目例子:输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
//输出:[8,9,9,9,0,0,0,1], 可以看到有进位这种东西
/**
 * 自己尝试的递归(不香,写到一半放弃了)
 * @param l1
 * @param l2
 * @return
 */
//    public ListNode addTwoNumbers2(ListNode l1, ListNode l2) {
//        if(l1 == null && l2 == null)    return null;
//        //其中一个长度为 0 
//        if(l1 == null && l2 != null)    return l2;
//        if(l1 != null && l2 == null)    return l1;
//        
//        ListNode l = addTwoNumbers2(l1.next, l2.next);
//        //剩下 l1 和 l2
//        int sum = l1.val + l2.val;
//        int carry = sum / 10;
//        ListNode head = null;
//        if(carry < 0) {
//            head = new ListNode(sum);
//            head.next = l;
//        }else {//进位的话,需要进行传递
//            int val = sum % 10;
//            head = new ListNode(val);
//            ListNode temp = l;
//            while(temp != null) {//这里边也需要考虑又再次进位了,递归不香了
////                temp.val
//            }
//        }
//        return head;
//    }
    //官网的方法:官网用 || 把链表是否为空的所有情况都考虑
    //(我是详细的分成四种情况 l1、l2同时为空; 11 为空,12 不为空; l1不为空,l2 为空; l1 、 l2 同时不为空)
    //而且我分析到 l1 、 l2 同时不为空 时,使用while(l1 != null && l2 != null), 后边就还得再次考虑 l1 (l2)链表还有剩下结点没有被访问到呢
     /**
      * 官网的框架:
        while (l1 != null || l2 != null){
                   if (l1 != null) {    
                     l1 = l1.next;
                 }
                 if (l2 != null) {
                     l2 = l2.next;
                 }        
         }
         比我的框架少写了好多重复代码啦
      * @author Huangyujun
      *
      */
     //然后 在 || 的情况下,拿到头结点的初始值(经过是否为空,空的初始值 为 0,否则就是头结点的值)
     class Solution2 {
         public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
             ListNode head = null, tail = null;    //从无到有,硬生生构建出一条链表(需要有两个指针(或者一个头结点和一个指针):其中一个指针用来实现遍历到下一个位置去创建结点,然后next 连起来,一个就是head啦)
             int carry = 0;
             while (l1 != null || l2 != null) {
                 //拿到头结点的初始值(经过是否为空,空的初始值 为 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);
                     tail = tail.next;
                 }
                 carry = sum / 10;
                 if (l1 != null) {    
                     l1 = l1.next;
                 }
                 if (l2 != null) {
                     l2 = l2.next;
                 }
             }
             if (carry > 0) {    //最后一位的考虑
                 tail.next = new ListNode(carry);
             }
             return head;
         }
     }
    //自己写的就是代码太啰嗦了(思路跟官网一样)
     public ListNode addTwoNumbers2(ListNode l1, ListNode l2) {
        if(l1 == null && l2 == null)    return null;
        if(l1 == null && l2 != null)    return l2;
        if(l1 != null && l2 == null)    return l1;
        ListNode ptr1 = l1;
        ListNode ptr2 = l2;
        ListNode head = new ListNode(0);
        ListNode tmp = head;
        int carry = 0;
        int sum = 0;
        while(ptr1 != null && ptr2 != null) {
            sum = ptr1.val + ptr2.val + carry;    //考虑到进位的情况
            //考虑进位
            carry = sum / 10;
            sum %= 10;
            ListNode p = new ListNode(sum);
            tmp.next = p;
            tmp = p;
            ptr1 = ptr1.next;
            ptr2 = ptr2.next;
        }
        while(ptr1 != null) {
            //tmp 继续走
            sum = ptr1.val + carry;    //考虑到进位的情况
            carry = sum / 10;
            sum %= 10;
            ListNode p = new ListNode(sum);
            tmp.next = p;
            tmp = p;
            ptr1 = ptr1.next;
        }
        while(ptr2 != null) {
            //tmp 继续走
            sum = ptr2.val + carry;    //考虑到进位的情况
            carry = sum / 10;
            sum %= 10;
            ListNode p = new ListNode(sum);
            tmp.next = p;
            tmp = p;
            ptr2 = ptr2.next;
        }
        if(carry != 0){//最后一位处理
            ListNode p = new ListNode(carry);
            tmp.next = p;
        }
        return head.next;
    }
}
目录
相关文章
|
6月前
|
存储 C++
两数相加(C++)
两数相加(C++)
42 0
|
1月前
|
存储 算法 C++
LeetCode第二题(两数相加)
这篇文章是关于LeetCode上第二题“两数相加”的题解,其中详细描述了如何使用C++语言来实现将两个逆序存储的非负整数链表相加,并返回结果链表的算法。
28 0
LeetCode第二题(两数相加)
|
3月前
|
算法
LeetCode第2题两数相加
该文章介绍了 LeetCode 第 2 题两数相加的解法,通过同时遍历两个链表的头节点,创建新链表接收计算结果,时间复杂度为 O(n)。
LeetCode第2题两数相加
|
3月前
|
JavaScript 前端开发 PHP
leetcode——两数相加【二】
leetcode——两数相加【二】
32 0
|
5月前
LeetCode###445. 两数相加 II
LeetCode###445. 两数相加 II
29 2
|
5月前
2.两数相加
2.两数相加
|
6月前
|
存储 算法 Go
LeetCode第二题: 两数相加
 给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
LeetCode第二题: 两数相加
|
6月前
|
存储
【力扣】2. 两数相加、445. 两数相加Ⅱ
【力扣】2. 两数相加、445. 两数相加Ⅱ
|
6月前
|
存储
leetcode-2:两数相加
leetcode-2:两数相加
41 0
|
存储 算法
LeetCode2-两数相加
LeetCode2-两数相加