Skip to content

Commit f1fc320

Browse files
author
javon
committed
单链表实现大数相加
1 parent 190f1ea commit f1fc320

7 files changed

Lines changed: 169 additions & 1 deletion

File tree

java-study/src/main/java/general/node/circle/CircleLength.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ public <E> int getLengthOfCircle(Node<E> head){
2626

2727
Node<E> slow = firstMeetingNode;
2828
Node<E> fast = firstMeetingNode;
29+
2930
for(int i = 1; ; i++){
3031
slow = slow.getNext();
3132
fast = fast.getNext().getNext();
3233
if(slow == fast){
3334
return i;
3435
}
3536
}
36-
3737
}
3838

3939

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package general.node.other;
2+
3+
import general.node.Node;
4+
5+
/**
6+
* 两个使用链表表示的大数相加
7+
* @author javon
8+
*
9+
*/
10+
public class BigNumberAdd {
11+
12+
static Node<Integer> NODE_ZERO = new Node<Integer>(0,null);
13+
14+
public Node<Integer> add(Node<Integer> head1, Node<Integer> head2){
15+
int carry = 0;
16+
int tmp = 0;
17+
Node<Integer> result = new Node<Integer>();
18+
Node<Integer> pre = new Node<Integer>();
19+
if(head1 == null && head2 == null){
20+
return null;
21+
}else if(head1 == null){
22+
return head2;
23+
}else if(head2 == null){
24+
return head1;
25+
}else{
26+
tmp = head1.getValue() + head2.getValue();
27+
}
28+
if(tmp >= 10){
29+
tmp -= 10;
30+
carry = 1;
31+
}
32+
pre.setValue(tmp);
33+
34+
result = pre;
35+
36+
while(true){
37+
Node<Integer> next = new Node<Integer>();
38+
if(head1.getNext() == null && head2.getNext() == null){
39+
if(carry == 1){
40+
next.setValue(carry);
41+
pre.setNext(next);
42+
}
43+
return result;
44+
}else if(head1.getNext() == null){
45+
head2 = head2.getNext();
46+
tmp = head2.getValue() + carry;
47+
}else if(head2.getNext() == null){
48+
head1 = head1.getNext();
49+
tmp = head1.getValue() + carry;
50+
}else{
51+
head2 = head2.getNext();
52+
head1 = head1.getNext();
53+
tmp = head1.getValue() + head2.getValue() + carry;
54+
}
55+
if(tmp >= 10){
56+
tmp -= 10;
57+
carry = 1;
58+
}else{
59+
carry = 0;
60+
}
61+
next.setValue(tmp);
62+
pre.setNext(next);
63+
pre = next;
64+
65+
}
66+
}
67+
68+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package general.node.other;
2+
3+
import static org.junit.Assert.fail;
4+
5+
import java.util.Random;
6+
7+
import org.junit.Before;
8+
import org.junit.Test;
9+
10+
import general.node.Node;
11+
12+
public class BigNumberAddTest {
13+
14+
private Node<Integer> head1 = new Node<Integer>(9, null);
15+
private Node<Integer> head2 = new Node<Integer>(8, null);
16+
17+
@Before
18+
public void init(){
19+
20+
Node<Integer> head1 = this.head1;
21+
Node<Integer> head2 = this.head2;
22+
Random random = new Random();
23+
for (int i = 0; i < 600; i++) {
24+
Node<Integer> next1 = new Node<Integer>(random.nextInt(9),null);
25+
head1.setNext(next1);
26+
head1 = next1;
27+
}
28+
29+
for (int i = 0; i < 700; i++) {
30+
Node<Integer> next2 = new Node<Integer>(random.nextInt(9),null);
31+
head2.setNext(next2);
32+
head2 = next2;
33+
}
34+
}
35+
36+
@Test
37+
public void test() {
38+
printNode(head1);
39+
System.out.println("+");
40+
printNode(head2);
41+
System.out.println("=");
42+
BigNumberAdd bigNumberAdd = new BigNumberAdd();
43+
Node<Integer> node = bigNumberAdd.add(head1, head2);
44+
printNode(node);
45+
}
46+
47+
48+
private void printNode(Node<Integer> head){
49+
System.out.print(head.getValue());
50+
while(head.getNext() != null){
51+
head = head.getNext();
52+
System.out.print(head.getValue());
53+
}
54+
System.out.println();
55+
}
56+
57+
58+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package general.node.other;
2+
3+
public class DeleteNode {
4+
5+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package general.node.other;
2+
3+
import general.node.Node;
4+
5+
/**
6+
* 有序链表合并
7+
* 链表为升序
8+
* @author javon
9+
*
10+
*/
11+
public class MergeNodeList {
12+
13+
public <E> Node<E> merge(Node<E> head1, Node<E> head2){
14+
if(head1 == null && head2 == null){
15+
return null;
16+
}else if(head1 == null){
17+
return head2;
18+
}else if(head2 == null){
19+
return head1;
20+
}else{
21+
return null;
22+
}
23+
24+
}
25+
26+
27+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package general.node.other;
2+
3+
public class ReverseNodeList {
4+
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package general.node.other;
2+
3+
public class ReversePrint {
4+
5+
}

0 commit comments

Comments
 (0)