牛客-NC40-两个链表生成相加链表

NC40. 两个链表生成相加链表(medium)


方法一:链表反转求和法

思路:先将这两个链表进行反转,再逐一遍历求和,注意进位,最后将新链表反转即可得到答案。

import java.util.*;

/* * public class ListNode { * int val; * ListNode next = null; * } */

public class Solution {
   
    /** * * @param head1 ListNode类 * @param head2 ListNode类 * @return ListNode类 */
    public ListNode addInList (ListNode head1, ListNode head2) {
   
        // write code here
        // 反转链表再相加
        head1 = reverse(head1);
        head2 = reverse(head2);
        ListNode head = new ListNode(-1);
        ListNode cur = head;
        int carry = 0;
        while (head1 != null || head2 != null) {
   
            int val = carry;
            if (head1 != null) {
   
                val += head1.val;
                head1 = head1.next;
            }
            if (head2 != null) {
   
                val += head2.val;
                head2 = head2.next;
            }
            cur.next = new ListNode(val % 10);
            carry = val / 10; // 进位
            cur = cur.next;
        }
        if (carry > 0) {
    // 退出循环后,还有进位
            cur.next = new ListNode(carry);
        }
        return reverse(head.next);
    }
    private ListNode reverse(ListNode head) {
   
        ListNode cur = head;
        ListNode pre = null;
        while (cur != null) {
   
            ListNode temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
}

时间复杂度: O(max(M + N)),M,N分别是head1和head2的链表长度。
空间复杂度: O(1),常量级空间复杂度。
总结:这道题最开始自己的做法是拿三个ArrayList来写,现在想想完全没必要哈,两个链表反转后直接可以求和了。当然,这里刚好复习了链表反转哈哈哈。

全部评论

相关推荐

10-28 11:04
已编辑
美团_后端实习生(实习员工)
一个2人:我说几个点吧,你的实习经历写的让人觉得毫无含金量,你没有挖掘你需求里的 亮点, 让人觉得你不仅打杂还摆烂。然后你的简历太长了🤣你这个实习经历看完,估计没几个人愿意接着看下去, sdk, 索引这种东西单拎出来说太顶真了兄弟,好好优化下简历吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务