对两个链表逆置;
从低位开始逐位进行加法运算;
对最高位的进位要生成新的结点;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
/**
内容:LeetCode.445 两数相加
时间:2020/1/17
作者:hjw
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head1 = new ListNode(0);
ListNode head2 = new ListNode(0);
ListNode p1 = l1;
ListNode p2 = l2;
ListNode tmp = null;
int len1 = 0, len2 = 0;
ListNode head = null;
ListNode pre = null;
//逆置单链表l1和l2
while(p1!=null)
{
tmp = p1.next;
p1.next = head1.next;
head1.next = p1;
p1 = tmp;
len1++;
}
while(p2!=null)
{
tmp = p2.next;
p2.next = head2.next;
head2.next = p2;
p2 = tmp;
len2++;
}
if(len1>len2) head = head1;
else head = head2;
ListNode p = head.next;
p1 = head1.next;
p2 = head2.next;
int sum = 0,carry = 0;
//执行按位加法
while(p1!=null&&p2!=null)
{
sum = p1.val+p2.val+carry;
if(sum/10<1)
{
p.val = sum ;
carry = 0;
}
else
{
p.val = sum%10;
carry = 1;
}
pre = p;
p = p.next;
p1 = p1.next;
p2 = p2.next;
}
//对更长的单链表的多余部分进行进位处理
int tmpSum = 0;
while(p!=null)
{
if(carry == 1)
tmpSum = p.val+1;
else
tmpSum = p.val;
if(tmpSum/10==1)
{
carry = 1;
p.val = tmpSum%10;
}
else
{
carry = 0;
p.val = tmpSum;
}
pre = p;
p = p.next;
}
//最高位进位要生成新的结点存储进位
if(carry == 1)
{
ListNode addNode = new ListNode(1);
pre.next = addNode;
addNode.next = null;
}
//逆置生成的单链表
p = head.next;
head.next = null;
while(p!=null)
{
tmp = p.next;
p.next = head.next;
head.next = p;
p = tmp;
}
return head.next;
}
}