`

java-7.微软亚院之编程判断俩个链表是否相交 给出俩个单向链表的头指针,比如 h1 , h2 ,判断这俩个链表是否相交

 
阅读更多

public class LinkListTest {

	/**
	 * we deal with two main missions:
	 * 
	 * A.
	 * 1.we create two joined-List(both have no loop)
	 * 2.whether list1 and list2 join
	 * 3.print the joinPoint
	 * 
	 * B.
	 * 1.create loop in list1 by itself
	 * 2.whether the list has loop
	 * 3.print the firstNode of loop
	 */
	public static void main(String[] args) {
		MyLinkList list1=new MyLinkList();
		int[] a={1,2,3,4,5,6,7,8,9,10};
		ListNode head1=list1.create(a);
		System.out.print("List1=");
		list1.display();
		
		MyLinkList list2=new MyLinkList();
		int[] b={11,12};
		ListNode head2=list2.create(b);
		ListNode joinPoint=list1.getNodeAt(3);
		ListNode tail02=list2.getTail();
		tail02.next=joinPoint;
		//now list2=11->12->3->4->5 ->6->7->8->9-> 10
		System.out.print("List2=");
		list2.display();
		LinkListTest.isJoined(head1,head2);
		
		//create a loop to find the join-point
		tail02=list2.getTail();
		tail02.next=head2;
		ListNode firsrNodeInLoop=list1.getFirstNodeInLoop(head1);
		System.out.println("The two joinedLink's joinPoint is "+firsrNodeInLoop.data);
		
		//delete the loop
		tail02.next=null;
		
		list1.setLoop(5);//create a loop like following:
		/*now list1=
		 			   ________________
		 			  /			       |
		 1->2->3->4->5 ->6->7->8->9-> 10
		 
		 */
		ListNode meetingPoint=list1.hasLoop(head1);
		if(meetingPoint!=null){
			System.out.println("Now List1  hasLoop,lowPoint&&fastPoint meets at  "+meetingPoint.data);
			firsrNodeInLoop=list1.getFirstNodeInLoop(head1);
			System.out.println("firstNode of Loop is "+firsrNodeInLoop.data);
		}
		
	}
	
	//whether list1 and list2 join
	static void isJoined(ListNode head1,ListNode head2){
		while(head1.next!=null){
			head1=head1.next;
		}
		while(head2.next!=null){
			head2=head2.next;
		}
		if(head1==head2){
			System.out.println("joined");
		}else{
			System.out.println("not joined");
		}
	}
}

class MyLinkList{
	
	private ListNode head;
	
	
	//建立单链表有两种方法:头插法建表和尾插法,后者需多建立一个尾指针
	//这里我用头插法
	public ListNode create(int[] a){
		ListNode firstNode=null;
		//starts with the last element
		for(int i=a.length-1;i>=0;i--){
			ListNode node=new ListNode(a[i]);
			node.next=firstNode;
			firstNode=node;
		}
		head=firstNode;
		return firstNode;
	}
	
	//if hasLoop,return the "Meeting-point".
	public ListNode hasLoop(ListNode head){
		ListNode p1=head;
		ListNode p2=head;
		while(p2!=null&&p2.next!=null){
			p1=p1.next;
			p2=p2.next.next;
			if(p1==p2){
				return p1;
			}
		}
		return null;
	}
	
	//display LinkList's elements while it has no loop
	public void display(){
		ListNode p=head;
		while(p!=null){
			System.out.print(p.data+",");
			p=p.next;
		}
		System.out.println();
	}
	
	//get the a[position]
	public ListNode getNodeAt(int position){
		ListNode node=head;
		while(--position>0){
			node=node.next;
		}
		return node;
	}
	
	//create a loop. Make tail's nextElement is a[i]
	public void setLoop(int i){
		ListNode p=head;
		while(p!=null&&p.next!=null){
			p=p.next;
		}
		ListNode loopPoint=getNodeAt(i);
		p.next=loopPoint;
	}
	
	//p1 traverse from head while p2 from "Meeting-point".When they meets,it's the firstNode of loop
	public ListNode getFirstNodeInLoop(ListNode head){
		ListNode re=null;
		ListNode p1=head;
		ListNode p2=hasLoop(head);
		if(p2!=null){
			while(true){
				p2=p2.next;
				p1=p1.next;
				if(p1==p2){
					re=p1;
					break;
				}
			}
		}
		return re;
	}
	
	//get the last node of LinkList
	public ListNode getTail(){
		ListNode p=head;
		while(p.next!=null){
			p=p.next;
		}
		return p;
	}
	
	public ListNode getHead() {
		return head;
	}
	public void clear(){
		head=null;
	}
	
}

class ListNode{
	int data;
	ListNode next;
	public ListNode(int data){
		this.data=data;
	}
}



0
0
分享到:
评论

相关推荐

    编程判断两个链表是否相交

    ### 编程判断两个链表是否相交 在计算机科学中,链表是一种常见的数据结构,广泛应用于多种算法实现和实际应用中。本篇文章将详细探讨如何判断两个单向链表是否相交的问题,以及相应的解决方案。 #### 问题背景 在...

    编程判断两个链表是否相交.pdf

    ### 编程判断两个链表是否相交 #### 背景介绍 在软件开发过程中,数据结构的应用极为广泛,其中链表作为一种基础且重要的数据结构,在很多场景下都有着不可替代的作用。对于链表而言,了解其是否与其他链表相交是...

    判断链表是否相交的几种算法1

    该方法通过将h1链表的尾节点的next指针指向h2链表的头节点,如果两个链表相交,此时h2会形成一个循环链表。接下来只需判断h2是否为循环链表,可以使用Floyd判断环算法或龟兔赛跑算法。这种方法的时间复杂度同样是O...

    java-leetcode题解之第160题相交链表.zip

    在本压缩包文件中,我们关注的是一个Java编程相关的学习资源,主要涵盖了LeetCode平台上的第160题——“相交链表”。这是一道经典的算法问题,旨在锻炼和提升程序员对链表操作的理解与处理能力。LeetCode是一个广受...

    python-leetcode面试题解之第160题相交链表-题解.zip

    在Python编程领域,LeetCode是一个非常重要的在线平台,它提供了大量的编程题目,旨在帮助程序员提升算法能力和准备求职面试。本题解将详细讨论LeetCode中的第160题——"相交链表",并使用Python语言进行解答。此...

    整数链表

    双向链表每个节点还包含一个指向前一个节点的指针,而循环链表则将最后一个节点的指针链接回链表的第一个节点。 ### 3. 链表类的设计 在实现整数链表时,首先需要创建一个类,比如命名为`IntegerLinkedList`。这个...

    单向链表 代码架构

    单向链表是一种基本的数据结构,它在计算机科学和编程中有着广泛的应用。与数组不同,链表中的元素不是在内存中连续存储的,而是通过指针或引用连接在一起,形成一个逻辑上的线性序列。单向链表的每个节点包含两部分...

    个人C语言学习实录练习题-链表.数据结构.快速排序练习.rar

    它与数组不同,数组中的元素在内存中是连续存储的,而链表的每个元素(节点)包含数据以及指向下一个节点的指针,这使得链表在动态添加、删除元素时具有更高的灵活性。本压缩包文件“个人C语言学习实录练习题-链表....

    数据结构来去除链表中的重复元素-java.zip

    在Java编程中,链表是一种常见且重要的数据结构,它被广泛用于处理动态集合,尤其在需要高效插入和删除操作的场景下。本主题聚焦于如何利用数据结构的方法去除链表中的重复元素,以优化链表的数据存储和提高程序效率...

    Double-list.zip_visual c_双链表

    双链表(Double-Linked List)是链表的一种变体,它在每个节点中不仅存储了数据,还额外存储了两个指针,分别指向该节点的前一个节点和后一个节点,这使得在链表中的插入和删除操作更加高效。 在“Double-list.zip...

    SPT-02-链表.pdf

    - 循环链表:最后一个节点的指针指向头节点,形成一个循环。 - 带头节点的链表:链表额外添加一个头节点,方便操作。 2. 链表的操作: - 插入:在链表的特定位置插入新节点,需要找到插入点,然后修改插入点前一...

    java-leetcode题解之第234题回文链表.zip

    代码通常会包括一个`isPalindrome`函数,它接受一个链表的头节点,然后进行相应的操作以判断链表是否为回文。 **优化和复杂度分析** 对于这两种方法,时间复杂度都是O(n),其中n是链表的长度,因为我们需要遍历...

    fantj2016#java-reader#LeetCode--21. 合并两个有序链表(Java)1

    * 如果l1和l2都不为空,则一直循环取值比较//如果l1比l2小,将l1赋值给listNode的下一个节点,l1指针下移* 如果一个链表空了,则将另一个链表复

    数据结构-链表.pdf

    线性表的数据元素之间存在唯一的前驱和后继关系,每个元素都有且只有一个“前驱元素”和一个“后继元素”,除第一个元素外,每个元素都有且只有一个“前驱元素”,除最后一个元素外,每个元素都有且只有一个“后继...

    算法设计-实验五-链表.docx

    与数组不同,链表的元素不需要连续的内存空间,每个元素(称为节点)包含数据和指向下一个节点的引用。本资源专注于Python中链表的实现,通过实验五的描述,我们可以学习以下关键知识点: 1. **链表的基本概念**: ...

    数据结构-链表.ppt

    数据结构-链表.ppt 头指针、头结点、开始结点的区别、并说明头指针和头结点的作用

    header-files-of-linear-table.rar_Table_c++链表类

    循环链表与双向链表类似,不同之处在于最后一个节点的指针会回指到第一个节点,形成一个闭合的环状结构。这种结构使得在链表末尾进行插入和删除操作时更为高效,因为它避免了检查是否到达链表末尾的额外步骤。循环...

    头插法、尾插法、链表长度test-c-master.zip

    在这个“头插法、尾插法、链表长度test_c-master.zip”压缩包中,我们可以推测包含的是关于链表操作的C语言实现,主要涉及了链表的头插法和尾插法以及如何计算链表的长度。 首先,让我们详细探讨一下链表中的头插法...

    Generic-Doubly-Linked-List-..zip_generic

    **标题解析:** "Generic-Doubly-Linked-List-..zip_generic" 这个标题表明,这是一个关于泛型(Generic)双向链表(Doubly-Linked List)的资料包,可能是用C或C++语言编写的。"Generic"指的是在编程中使用模板或者...

Global site tag (gtag.js) - Google Analytics