两个链表相加成一个链表
public int Node{
public int value;
public Node next;
public Node(int data){
this.value = data;
}
}
public Node addList1(Node head1,Node head2){
Stack<Integer> s1 = new Stack<Integer>();
Stack<Integer> s2 = new Stack<Integer>();
while(head1 != null){
s1.push(head1.value);
head1 = head1.next;
}
while(head2 != null){
s2.push(head2.value);
head2 = head2.next;
}
int ca = 0;
int n1 = 0;
int n2 = 0;
int n = 0;
Node node = null;
Node pre = null;
while(!s1.isEmpty() || !s2.isEmpty()){
n1 = s1.isEmpty()?0:s1.pop();
n2 = s2.isEmpty()?0:s2.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;
}
//利用链表的逆序求解,省掉栈空间
public Node addList2(Node head1,Node head2){
head1 = reverseList(head1);
head2 = reverseList(head2);
int ca = 0;
int n1 = 0;
int n2 = 0;
int n = 0;
Node c1 = head1;
Node c2 = head2;
Node node = null;
Node pre = null;
while(c1!=null ||c2!=null){
n1 = c1!=null?c1.value:0;
n2 = c2!=null?c2.value:0;
n = n1 + n2 + ca;
pre = node;
node = new Node(n%10);
node.next = pre;
ca = n/10;
n1 = c1!=null?c1.next:null;
n2 = c2!=null?c2.next:null;
}
if(ca == 1){
pre = node;
node = new Node(1);
node.next = pre;
}
reverList(head1);
reverList(head2);
return node;
}
二叉搜索树转换成双向链表
//将二叉树转换成双向链表,先将二叉树转换成中序入队列,
//然后弹出元素,转成双向链表
public Node convert1(Node head){
Queue<Node> queue = new LinkedList<Node>();
inOrderToQueue(head,queue);
if(queue.isEmpty()){
return head;
}
head = queue.poll();
Node pre = head;
pre.left = null;
Node cur = null;
while(!queue.isEmpty()){
cur = queue.poll();
pre.right = cur;
cur.left = pre;
pre = cur;
}
pre.right = null;
return head;
}
public void inOrderToQueue(Node head,Queue<Node> queue){
if(head == null){
return;
}
inOrderToQueue(head.left,queue);
queue.offer(head);
inOrderToQueue(head.right,queue);
}