两个单链表的相交判断

前面一篇文章介绍了链表存在环及环的各种操作,本文主要来看两个链表的相交操作。



看以下代码:

/** 链表类 */
class Link{
	
	Entry head = new Entry();
	
	 /** 节点类,用于节点初始化 */
	class Entry{
		int data;
		Entry next;
		public Entry() {
			data = -1;
			next = null;
		}
		public Entry(int data) {
			this.data = data;
			next = null;
		}
	}
	
	/** 头插法 */
	public void insertHead(int data) {
		Entry cur = new Entry(data);
		cur.next = head.next;
		head.next = cur;
		
	/** 输出 */
	public void print() {
		Entry cur = head.next;
		while(cur != null) {
			System.out.print(cur.data + "\t");
			cur = cur.next;
		}
		System.out.println();
	}
}

操作类代码:

public class LinkTest {
	
	/** 制作一个相交链表 */
	public static void makeIntersectLink(Link t1, Link t2) {
		Link.Entry head1 = t1.head;
		Link.Entry head2 = t2.head;
		// 让两个链表交于第二个链表的第二个结点
		head1.next.next = head2.next.next;
	}
	
	/** 判断是否相交 */
	public static boolean isIntersect(Link t1,Link t2) {
		Link.Entry head1 = t1.head;
		Link.Entry head2 = t2.head;
		//  若两个链表不等长,求出长度差值,并使第一个链表是最长的
		int newLen = t1.getLength() - t2.getLength();
		if (newLen < 0) {
			head1 = t2.head;
			head2 = t1.head;
		}
		// 让较长的链表先遍历它比另一个链表长的部分
		for (int x = 0; x < newLen; x++) {
			head1 = head1.next;
		}
		// 从相同的长度开始遍历两个链表,判断是否相交
		while (head1.next != null && head2.next !=null && head1 != head2) {
			head1 = head1.next;
			head2 = head2.next;
		}
		// 再次确定相交的条件是while循环结束是因为两个链表的结点为同一个
		if (head1 != null && head2 != null && head1 == head2) {
				return true;
		}
		return false;
	}
	
	public static void main(String [] args) {
		Link link1 = new Link();
		Link link2 = new Link();
		// 动态制作链表
		for (int x = 0; x < 12; x++) {
			link1.insertHead(x);
		}

		// 制作相交链表
		makeIntersectLink(link1,link2);
		System.out.print("两个链表");
		System.out.println(isCut(link1,link2)?"是相交的":"不是相交的");
		System.out.println("链表1是 :");
		link1.print();
		System.out.println("链表2是 :");
		link2.print();
	}
}

结果是:

		两个链表是相交的
		链表1是 :
		0 1 2 3 4 5 6 7 8 9 10 11 
		链表2是 :
		1 2 3 4 5 6 7 8 9 10 11 	

你可能感兴趣的:(数据结构)