引言
我们继续加深/和%的操作,再来做一下这一道题.
题目
两个链表相加比如
9->3->7->null这是第一个链表,6->3->null这个是第二个链表,这两个相加为1->0->0->0->null.
解法1
我们通过两个栈实现
Stack<Integer> stack1=new Stack<Integer>();
Stack<Integer> stack2=new Stack<Integer>();
while(head1!=null)
{
stack1.push(head1.value);
head1=head1.next;
}
while(head2!=null)
{
stack2.push(head2.value);
head2=head2.next;
}
这个时候,同时出栈,然后进行运算.下面就是操作的核心代码
int n1=0;
int n2=0;
int n=0;
int ca=0;
Node pre=null;
Node node=null;
while(!stack1.isEmpty()||!stack2.isEmpty())
{
n1=stack1.isEmpty()?0:stack1.pop();
n2=stack2.isEmpty()?0:stack2.pop();
n=n1+n2+ca;
pre=node;
node=new Node(n%10);
node.next=pre;
ca=n/10;
}
if(ca==1)
{
pre=node;
node=new Node(1);
node.next=pre;
}
return node;
记住,这个链表式从后向前建立的,同时我们需要注意pre和node的交替使用
pre=node;
node = new node;
node.next=pre;
然后循环往复,这是第一种解法,以下是第二种解法.
首先是逆序字符串
public static Node reverseList(Node head)
{
Node pre=null;
Node next=null;
while(head!=null)
{
next=head.next;
head.next=pre;
pre=head;
head=next;
}
return pre;
}
然后就是核心代码
public static Node addTwoList(Node head1,Node head2)
{
head1=reverseList(head1);
head2=reverseList(head2);
Node cur1=head1;
Node cur2=head2;
int n1;
int n2;
int n;
int res;
int ca=0;
Node pre=null;
Node node=null;
while(cur1!=null||cur2!=null)
{
n1=cur1==null?0:cur1.value;
n2=cur2==null?0:cur2.value;
n=n1+n2+ca;
pre=node;
node=new Node(n%10);
node.next=pre;
ca=n/10;
cur1 = cur1 != null ? cur1.next : null;
cur2 = cur2 != null ? cur2.next : null;
}
if(ca==1)
{
pre=node;
node=new Node(1);
node.next=pre;
}
head1=reverseList(head1);
head2=reverseList(head2);
return node;
}
总结
其中最重要的就是边计算,边生成链表.如何用最短的代码实现,我们拿第二个没有使用其他空间的方式在写一下(空间复杂度为O(1))
while(cur1!=null||cur2!=null)
{
n1=cur1==null?0:cur1.value;
n2=cur2==null?0:cur2.value;
n=n1+n2+ca;
pre=node;
node=new Node(n%10);
node.next=pre;
ca=n/10;
cur1 = cur1 != null ? cur1.next : null;
cur2 = cur2 != null ? cur2.next : null;
}