当前位置:网站首页>两个链表相加

两个链表相加

2022-08-09 12:01:00 爱敲代码的Harrison

题目

力扣链接:两数相加

在这里插入图片描述

方法一:把链表转换为数字再相加?但是链表的长度可能会很长,就算是long类型长度也不够,所以此方法不可取!

方法二:利用容器?遍历链表,然后生成一个相应长度的数组,再将链表中的每个值拷贝进数组;另外一个链表也是如此。然后将数组中的每一个数对应相加,但是要处理好进位!最后通过数组形式还原成链表。此方法可以在笔试时候用,因为笔试不会太看重空间复杂度,并且此方法coding相比第三种方法稍微没那么容易出错,很可能笔试时候想不到第三种方法。

方法三:看代码

代码
package com.harrison.class06;

/** * @author Harrison * @create 2022-06-19-16:22 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */
public class Code08_AddTwoNumbers {
    
    public class ListNode {
    
        int val;
        ListNode next;

        ListNode() {
    
        }

        ListNode(int val) {
    
            this.val = val;
        }

        ListNode(int val, ListNode next) {
    
            this.val = val;
            this.next = next;
        }
    }

    public ListNode addTwoNumbers(ListNode head1, ListNode head2) {
    
        int len1 = listLen(head1);
        int len2 = listLen(head2);
        ListNode l = len1 >= len2 ? head1 : head2;
        ListNode s = l == head1 ? head2 : head1;
        ListNode curL = l;
        ListNode curS = s;
        ListNode last = curL;
        int carry = 0;
        int curNum = 0;
        while (curS != null) {
    
            curNum = curS.val + curL.val + carry;
            curL.val = (curNum % 10);
            carry=(curNum/10);
            last=curL;
            curL=curL.next;
            curS= curS.next;
        }
        while(curL!=null){
    
            curNum=curL.val+carry;
            curL.val=(curNum%10);
            carry=(curNum/10);
            last=curL;
            curL= curL.next;
        }
        if(carry!=0){
    
            last.next=new ListNode(1);
        }
        return l;
    }

    public static int listLen(ListNode head) {
    
        int len = 0;
        while (head != null) {
    
            len++;
            head = head.next;
        }
        return len;
    }
}

原网站

版权声明
本文为[爱敲代码的Harrison]所创,转载请带上原文链接,感谢
https://harrison-lhs.blog.csdn.net/article/details/125359254