牛客Top200---链表相加(java详解)

Posted 小样5411

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客Top200---链表相加(java详解)相关的知识,希望对你有一定的参考价值。

题目


该题和大数加法类似,思路可以借鉴,大数加法

题解

解法1:通过反转链表进行相加

import java.util.*;

public class Solution {
    public ListNode addInList (ListNode head1, ListNode head2) {
        //解法1:通过反转链表相加
        if(head1 == null){
            return head2;
        }
        if(head2 == null){
            return head1;
        }
        ListNode l1 = reverse(head1);//链表反转
        ListNode l2 = reverse(head2);
        int carry = 0;//进位
        ListNode head = new ListNode(-1);//相加后得到链表的head
        //carry!=0是为了保证两个整数位数相同最后发生进位,但两个链表head都为空,还有一个进位要算
        //如56和72,一开始6+2=8,第二次sum=5+7=12 sum%10=2,carry为进位等于1,就是这个1
        while(l1 != null || l2 != null || carry != 0){
            int num1 = (l1 == null) ? 0 : l1.val;//两个位数不一样就要补0再加
            int num2 = (l2 == null) ? 0 : l2.val;
            int sum = num1 + num2 + carry;
            carry = sum / 10;
            //头插法
            ListNode next = head.next;
            ListNode node = new ListNode(sum % 10);
            head.next = node;//关键两步
            node.next = next;
            //非空,则两个链表分别向后移动
            if(l1 != null){
                l1 = l1.next;
            }
            if(l2 != null){
                l2 = l2.next;
            }
        }
        return head.next;
    }
    //反转链表
    private ListNode reverse(ListNode head){
        ListNode pre = null;
        ListNode cur = head;
        while(cur != null){
            ListNode next = cur.next;//先记录cur下一个
            cur.next = pre;//反向连接
            pre = cur;
            cur = next;
        }
        return pre;//返回pre,最后cur=null
    }
}

解法2:通过栈

import java.util.*;

public class Solution {
    public ListNode addInList (ListNode head1, ListNode head2) {
        //解法2:通过栈实现
        //声明两个栈,栈1和栈2
        Stack<Integer> stack1 = new Stack<>();
        Stack<Integer> stack2 = new Stack<>();
        //两个链表先入栈
        while(head1 != null){
            stack1.push(head1.val);
            head1 = head1.next;
        }
        while(head2 != null){
            stack2.push(head2.val);
            head2 = head2.next;
        }
        int carry = 0;//进位,初始为0
        ListNode head = new ListNode(-1);//用于链接相加后的链表
        //进行加法,循环中carry!=0表示如果两个整数的位数相同,可能还需进位算一下,如658和592
        //6+5完成后,carry=1,此时stack1和stack2都为空,但是还要将这个1进位放最前面,得到1250
        while(!stack1.isEmpty() || !stack2.isEmpty() || carry != 0){
            int num1 = stack1.isEmpty()?0:stack1.pop();//可能两个数位数不一样,位数少的不够,已经全部出栈了,但另一个还不为空,这时就要补0
            int num2 = stack2.isEmpty()?0:stack2.pop();
            int sum = num1+num2+carry;//求和
            carry = sum / 10;//记录进位
            //头插法,正好会再逆序一下,从而得到目标结果
            ListNode next = head.next;//头插先保留head
            ListNode cur = new ListNode(sum % 10);
            head.next = cur;//最主要两步
            cur.next = next;
        }
        return head.next;
    }
}

头插法

以上是关于牛客Top200---链表相加(java详解)的主要内容,如果未能解决你的问题,请参考以下文章

牛客Top200---链表中的节点每k个一组翻转(java通俗易懂详解)

牛客Top200---括号序列(java详解)

牛客Top200---合并k个有序链表(java)

牛客Top200---链表排序(java)

牛客Top200---大数加法(java详解)

LeetCode Hot 100 --- 两数相加(java)