厚积薄发打卡Day107:链表(五)<链表中的数字相加>
链表中的数字相加
题目:给定两个表示非负整数的单向链表,请问如何实现这两个整数的相加并且把它们的和仍然用单向链表表示?链表中的每个节点表示整数十进制的一位,并且头节点对应整数的最高位数而尾节点对应整数的个位
数。例如,在链表(a)和链表(b)中,两个链表分别表示整数123和 531,它们的和为654,对应的链表(c)所示。
a: 1->2->3
b: 5->3->1
c: 6->5->4
思路
-
因为涉及到进制的转换,所以应该需要将链表对齐
-
举例:
- 链表1:9->8->4
- 链表2:1->8
-
计算过程:
-
反转为:
- 链表1^:4->8->9
链表2^:8->1
- 链表1^:4->8->9
-
相加:
` ` :4->8->9 :8->1 ---------- 2 0 0 1
1^ + 2^ = 2001
-
反转:
- 2001^ ==> 1002
- 即结果 984+18 = 1002 (验证正确)
-
实现
/**
* 两链表相加
*/
public class AddNodeList01 {
public static ListNode addTwoNumbers(ListNode head1, ListNode head2) {
head1 = ReverseNodeList.reverseNodeList(head1);
head2 = ReverseNodeList.reverseNodeList(head2);
ListNode reverseHead = addReversed(head1, head2);
return ReverseNodeList.reverseNodeList(reverseHead);
}
private static ListNode addReversed(ListNode head1, ListNode head2) {
ListNode dummy = new ListNode(0);
ListNode sumNode = dummy;
int carry = 0;
while (head1 != null || head2 != null) {
int sum = (head1 == null ? 0 : head1.val) + (head2 == null ? 0 : head2.val) + carry;
carry = sum >= 10 ? 1 : 0;
sum = sum >= 10 ? sum - 10 : sum;
ListNode newNode = new ListNode(sum);
sumNode.next = newNode;
sumNode = sumNode.next;
head1 = head1 == null ? null : head1.next;
head2 = head2 == null ? null : head2.next;
}
if (carry > 0) {
sumNode.next = new ListNode(carry);
}
return dummy.next;
}
public static void main(String[] args) {
ListNode n1 = new ListNode(9);
ListNode n2 = new ListNode(8);
ListNode n3 = new ListNode(4);
n1.next = n2;
n2.next = n3;
ListNode.printNodeList(n1);
ListNode n4 = new ListNode(1);
n4.next = new ListNode(8);
ListNode.printNodeList(n4);
ListNode.printNodeList(addTwoNumbers(n1,n4));
}