题解 | 链表相加(二)
链表相加(二)
https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b
反转链表+进位模拟
由于加法需要从个位开始,所以最直观的策略就是将链表反转,从个位数开始,从左到右计算结果,计算完再反转回来即可
- 反转链表:将 9->3->7 变为 7->3->9,将 6->3 变为 3->6
- 同步遍历求和:从头开始相加,维护一个进位变量 carry
- 构建新链表:每次计算出当前位的值(sum % 10)和进位值(sum / 10)
- 最终反转:将得到的结果链表再次反转,恢复正确的高低位顺序
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
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 dummy = new ListNode(-1);
ListNode curr = dummy;
int carry = 0;
// 2.模拟加法逻辑
while(head1 != null || head2 != null || carry != 0) {
int val1 = (head1 != null) ? head1.val : 0;
int val2 = (head2 != null) ? head2.val : 0;
int sum = val1 + val2 + carry;
carry = sum / 10;
curr.next = new ListNode(sum % 10);
curr = curr.next;
if(head1 != null) head1 = head1.next;
if(head2 != null) head2 = head2.next;
}
return reverse(dummy.next);
}
private ListNode reverse(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while(curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
}
