题目
解题思路
- 方法一:
两个链表长度可能不一样,把链表节点转换成整数,然后整数相加,最后求得的和还原成链表。但是整数相加的时候,可能会整数溢出。所以此方法不可行。
- 方法二:
反转链表,使得原链表两两尾部对齐,也就是我们可以从个位数开始,逐个位数相加。最后还原反转的链表。
具体代码如下:
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
l1 = reverseList(l1);
l2 = reverseList(l2);
return reverseList(addReversed(l1, l2));
}
private ListNode addReversed(ListNode reverseL1, ListNode reverseL2) {
int carry = 0;
ListNode dummy = new ListNode(0);
ListNode sumNode = dummy;
while(reverseL1 != null || reverseL2 != null) {
int sum = (reverseL1 == null ? 0 : reverseL1.val) + (reverseL2 == null ? 0 : reverseL2.val) + carry;
carry = sum >= 10 ? 1 : 0;
sum = sum >= 10 ? sum - 10 : sum;
ListNode newNode = new ListNode(sum);
sumNode.next = newNode;
sumNode = sumNode.next;
reverseL1 = reverseL1 == null ? null : reverseL1.next;
reverseL2 = reverseL2 == null ? null : reverseL2.next;
}
if(carry > 0) {
sumNode.next = new ListNode(carry);
}
return dummy.next;
}
private ListNode reverseList(ListNode head){
ListNode pre = null;
ListNode cur = head;
while(cur != null) {
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
总结
求链表中的数字相加,可利用反转链表的特性,从数字的个位数开始相加。