判断两个单链表是否相交
首先,我们先创建一个相交的链表
public class LinkDemo {
//创建一个相交的单链表
public static void createCutLink(TestLink testLink1,TestLink testLink2){
TestLink.Entry head1 = testLink1.getHead();
TestLink.Entry head2 = testLink2.getHead();
head1.next.next = head2.next.next.next.next;
}
}
判断是否相交
//判断两个单链表是否相交
public static boolean isCut(TestLink testLink1,TestLink testLink2) {
TestLink.Entry head1 = testLink1.getHead();//默认head1指向长的单链表
TestLink.Entry head2 = testLink2.getHead(); //默认head2指向短的单链表
int len1 = testLink1.getLength(); //得到链表1的长度
int len2 = testLink2.getLength(); //得到链表2的长度
int myLen = len1 - len2; //看哪个长
if (myLen < 0) { //链表2长
head1 = testLink2.getHead(); //让head1指向长的单链表
head2 = testLink1.getHead(); //让head2指向短的单链表
myLen = len2 - len1; //链表2比链表1长的长度
}
for (int i = 0; i < myLen; i++) { //让长的单链表先走myLen长度
head1 = head1.next;
}
while (head1 != head2 && head1 != null && head2 != null) {//head1和head2 一人一步走
head1 = head1.next;
head2 = head2.next;
}
if (head1 == head2 && head1 != null && head2 != null) {
return true; //相遇就证明相交
}
return false;
}
合并两个单链表
public static TestLink.Entry mergeLink(TestLink link1,TestLink link2){
TestLink.Entry newHead = null;
TestLink.Entry p1 = link1.getHead();
TestLink.Entry p2 = link2.getHead();
if (p1.next.data < p2.next.data){
newHead = p1;
}else {
newHead = p2;
}
p1 = p1.next;
p2 = p2.next;
TestLink.Entry tmpHead = newHead;
while (p1 != null && p2 != null){
if (p1.data < p2.data){
tmpHead.next = p1;
p1 = p1.next;
}else {
tmpHead.next = p2;
p2 = p2.next;
}
tmpHead = tmpHead.next;
}
if (p1 == null){
tmpHead.next = p2;
}
if (p2 == null){
tmpHead.next = p1;
}
return newHead;
}
打印合并之后的单链表
public static void showMerge(TestLink.Entry entry){
TestLink.Entry cur = entry.next;
while(cur != null){
System.out.print(cur.data + " ");
cur = cur.next;
}
}
public static void main(String[] args) {
TestLink testLink = new TestLink();
testLink.insertTail(1);
testLink.insertTail(2);
testLink.insertTail(3);
testLink.insertTail(45);
testLink.insertTail(100);
TestLink testLink2 = new TestLink();
testLink2.insertTail(10);
testLink2.insertTail(20);
testLink2.insertTail(30);
testLink2.insertTail(40);
testLink2.insertTail(50);
testLink2.insertTail(60);
showMerge(mergeLink(testLink,testLink2));
}