Java教程

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;
    }
     
}

 

这篇关于2_两数相加的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!