/**
* 判断链表是否有环,如果有,返回入环节点的值,没有环,返回null
* 入环的节点特征:
* @return
*/
public T getLinkCircleVal(){
Entry<T> slow = this.head.next;
Entry<T> fast = this.head.next;
// 使用快慢指针解决该问题
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
if(slow == fast){
break;
}
}
if(fast == null){
return null;
} else {
// fast从第一个节点开始走,slow从快慢指针相交的地方开始走,它们相遇的时候,就是环的入口节点
fast = this.head.next;
while(fast != slow){
fast = fast.next;
slow = slow.next;
}
return slow.data;
}
}
/**
* 合并两个有序的单链表
* @param link
*/
public void merge(Link<T> link){
Entry<T> p = this.head;
Entry<T> p1 = this.head.next;
Entry<T> p2 = link.head.next;
// 比较p1和p2节点的值,把值小的节点挂在p的后面
while(p1 != null && p2 != null){
if(p1.data.compareTo(p2.data) >= 0){
p.next = p2;
p2 = p2.next;
} else {
p.next = p1;
p1 = p1.next;
}
p = p.next;
}
if(p1 != null){ // 链表1还有剩余节点
p.next = p1;
}
if(p2 != null){ // 链表2还有剩余节点
p.next = p2;
}
}
}