概述
输入两个链表,找出他们的第一个公共结点
解题思路:
此处类名我用汉字,主要为了自己练习,为了后期好找到进行回顾。最要用标准的英文类名呦
/*
题:输入两个链表,找出他们的第一个公共结点
重点审题:这种题只知道有两个链表,并不知道链表的长度
*/
public class 链表第一个公共结点 {
class Node{
Integer value;
Node next = null;
public Node(Integer value){
this.value = value;
}
}
//链表的头结点
public Node nn = new Node(null);
public Node n = nn;
public void add(Integer num){
n.next = new Node(num);
n = n.next;
}
//第一种方法:直接遍历两个链表找到相同的结点,采用两层循环,时间复杂度为O(n²),时间复杂度太高
//第二种方法:单独变量里两个链表,算出链表的长度,A为两个链表长度的差值,让链表长度长的先走A步,然后两个链表一块走
// 这样时间复杂度为O(n)
public static Integer find(Node a,Node b){
//求两个链表的长度
int lengtha = 0;
int lengthb = 0;
Node aa = a;
Node bb = b;
while (a.next!=null){
lengtha++;
a = a.next;
}
while (b.next!=null){
lengthb++;
b = b.next;
}
// System.out.println(lengtha+" "+lengthb);
Integer max = Math.max(lengtha,lengthb);
for(int i=1;i<=max;i++){
//让最长链表先走Math.abs(lengtha-lengthb)步
if(i<=(Math.abs(lengtha-lengthb))){
if(max==lengtha){
aa = aa.next;
}else{
bb = bb.next;
}
continue;
}
//差值步数走完后,让两个链表一块走,直到有相同的结点值时输出
aa = aa.next;
bb = bb.next;
if(aa.value==bb.value){
System.out.println("在最长链表的第 "+i+" 结点为第一个公共结点");
System.out.println("在最短链表的第 "+(i-Math.abs(lengtha-lengthb))+" 结点为第一个公共结点");
return aa.value;
}
}
return null;
}
public static void main(String[] args) {
//现在有两个链表 a 和 b;第一个公结点为7
//但是我们事先并不知道链表里的值和长度,这两个链表只是测试用例
链表第一个公共结点 a = new 链表第一个公共结点();
Node aa = a.nn;
a.add(10);
a.add(30);
a.add(6);
a.add(2);
链表第一个公共结点 b = new 链表第一个公共结点();
Node bb = b.nn;
b.add(5);
b.add(8);
b.add(9);
b.add(6);
b.add(2);
System.out.println("第一个公共结点的值为:"+find(aa,bb));
}
}
最后
以上就是善良保温杯为你收集整理的输入两个链表,找出他们的第一个公共结点输入两个链表,找出他们的第一个公共结点的全部内容,希望文章能够帮你解决输入两个链表,找出他们的第一个公共结点输入两个链表,找出他们的第一个公共结点所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复