我是靠谱客的博主 粗犷鞋子,最近开发中收集的这篇文章主要介绍LeetCode - 025. 链表中的两数相加LeetCode - 025. 链表中的两数相加,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

LeetCode - 025. 链表中的两数相加

在这里插入图片描述

方法一:通过链表反转 + 分情况

首先,我们将链表分为一长一短,由此链表相加可以分为三种情况:

我们用curS表示当前短链表走到的位置,curL表示当前长链表走到的位置,carray表示进位,last用于存储null的上一个节点,方便当长短链表都走完而carry不为0时,新增节点

①长链表没走完,短链表也没走完

//有长有短
while(curS != null){
    int sum = curL.val + curS.val + carray;
    curL.val = sum % 10;
    carray = sum / 10;
    last = curL;//存储null的上一个节点
    curL = curL.next;
    curS = curS.next;
}

②只有长

//有长无短
while(curL != null){
    int sum = curL.val + carray;
    curL.val = sum % 10;
    carray = sum / 10;
    last = curL;
    curL = curL.next;
}

③无长无短

//无长无短
if(carray != 0){
    last.next = new ListNode(1);
}

④反转链表(注意最后结果也需要反转)

public ListNode reverse(ListNode head){
    if(head == null){
        return null;
    }
    ListNode pre = null;
    ListNode cur = head;
    ListNode next = cur.next;
    while(cur != null){
        next = cur.next;
        cur.next = pre;
        pre = cur;
        cur = next;
    }
    return pre;
}

全部代码:

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //获取两链表长度
        int len1 = getLength(l1);
        int len2 = getLength(l2);
        l1 = reverse(l1);
        l2 = reverse(l2);
        ListNode l = len1 >= len2 ? l1 : l2;//长链表
        ListNode s = len1 < len2 ? l1 : l2;
        ListNode curL = l;
        ListNode curS = s;
        ListNode last = curL;
        int carray = 0;//进位
        int sum = 0;
        //有长有短
        while(curS != null){
            sum = curL.val + curS.val + carray;
            curL.val = sum % 10;
            carray = sum / 10;
            last = curL;//存储null的上一个节点
            curL = curL.next;
            curS = curS.next;
        }
        //有长无短
        while(curL != null){
            sum = curL.val + carray;
            curL.val = sum % 10;
            carray = sum / 10;
            last = curL;
            curL = curL.next;
        }
        //无长无短
        if(carray != 0){
            last.next = new ListNode(1);
        }
        return reverse(l);
    }
    public int getLength(ListNode l){
        int res = 0;
        if(l == null) return res;
        while(l != null){
            res++;
            l = l.next;
        }
        return res;
    }
    public ListNode reverse(ListNode head){
        if(head == null){
            return null;
        }
        ListNode pre = null;
        ListNode cur = head;
        ListNode next = cur.next;
        while(cur != null){
            next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
}

方法二:通过Deque实现【使用栈的特性实现】

首先,将两个不同的链表分别入不同的栈,再利用栈的特性分别出栈

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        Deque<Integer> stack1 = new ArrayDeque<>();
        Deque<Integer> stack2 = new ArrayDeque<>(); 
        while(l1 != null){
            stack1.push(l1.val);
            l1 = l1.next;
        }
        while(l2 != null){
            stack2.push(l2.val);
            l2 = l2.next;
        }
        int carray = 0;//进位
        ListNode res = null;
        while(!stack1.isEmpty() || !stack2.isEmpty() || carray != 0){
            int a = stack1.isEmpty() ? 0 : stack1.pop();
            int b = stack2.isEmpty() ? 0 : stack2.pop();
            int sum = a + b + carray;
            carray = sum / 10;
            int val = sum % 10;
            ListNode cur = new ListNode(val);
            cur.next = res;
            res = cur;
        }
        return res;
    }
}

最后

以上就是粗犷鞋子为你收集整理的LeetCode - 025. 链表中的两数相加LeetCode - 025. 链表中的两数相加的全部内容,希望文章能够帮你解决LeetCode - 025. 链表中的两数相加LeetCode - 025. 链表中的两数相加所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部