牛客-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来写,现在想想完全没必要哈,两个链表反转后直接可以求和了。当然,这里刚好复习了链表反转哈哈哈。