当前位置: 首页 > 编程日记 > 正文

7_2判断两个单链表是否相交,若相交,求出第一个交点

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4251372.html

声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明。谢谢。

题目:7_2判断两个单链表是否相交,若相交,求出第一个交点。

题目分析:

创建A,B两个单链表,将B的尾部指向头部,若两个单链表相交,则交点必为环的入口,这就又变成上边判断一个单链表是否有环的问题了。

注: 若两个单链表相交,则相交之后的那些节点比都是一样的(相交之后的长度是一样的),否则若一长一短或者相交之后有分叉,则在短链表末尾或者分叉节点处,该节点将有两个next分别指向两边的链表,这就不是单链表了。

源码实现:

  1 package com.interview;
  2 
  3 /**
  4  * 判断两个单链表是否相交,若相交,求出第一个交点
  5  * 方法:创建A,B两个单链表,将B的尾部指向头部,若两个单链表相交,则交点必为环的入口
  6  *   若两个单链表相交,则相交之后的那些节点比都是一样的(相交之后的长度是一样的),
  7  *   否则若一长一短或者相交之后有分叉,则在锻炼表末尾或者分叉节点处,该节点将有
  8  *   两个next分别指向两边的链表,这就不是单链表了
  9  * @author wjh
 10  *
 11  */
 12 public class _7_2JudgeListCross {
 13 
 14     /**
 15      * @param args
 16      */    
 17     //分别记录相交前A表的长度,B链表(圈)的长度,第一次相遇时慢指针走的总长度
 18     public static int x=0, y=0, k=0;   
 19     public static void main(String[] args) {
 20         //1)创建两个相交的链表
 21         Node nodeA = createList("A", 28);
 22         Node nodeB = createList("B", 3);
 23         Node tail = createTail(3);
 24         nodeA = merge(nodeA, tail);
 25         nodeB = merge(nodeB, tail);        
 26         //2)将B的尾节点指向B的第一个节点 ,此时若相交,A的结构就变成带环单链表了,
 27             //若不相交则遍历A会走到null
 28         Node r = findTail(nodeB);  //若要求A B的长度,则在上面遍历nodeA,nodeA
 29         r.next = nodeB.next;
 30         judge(nodeA);
 31 
 32     }
 33     
 34     
 35     //创建带头节点的无环单链表的相较之前的部分
 36     public static Node createList(String name, int k){
 37         /**  1)用尾插法构建单链表,此处构建有环单链表,让node24指向node6*/
 38         Node first = new Node(null,null);    //头节点
 39         Node r = first;   //指向链表的尾节点
 40         for(int i=1;i<=k;i++){  //根据传入参数创建相交之前的部分节点
 41             Node node = new Node("猫狗_"+name+"_"+i,null);
 42             r.next = node;
 43             r = node;
 44         }
 45         r.next = null;       //若是构建无环单链表,此处   r.next = null;
 46         return first;
 47     }
 48     
 49     //创建带头节点的无环单链表的相较之后的相同的部分
 50     public static Node createTail(int k){
 51         Node first = new Node(null,null);    //头节点
 52         Node r = first;   //指向链表的尾节点
 53         for(int i=1;i<=k;i++){  //创建相交之后的部分节点
 54             Node node = new Node("相同节点@"+i,null);
 55             r.next = node;
 56             r = node;
 57         }
 58         r.next = null;       //若是构建无环单链表,此处   r.next = null;
 59         return first;
 60     }
 61     
 62     //将相交之前和相交之后的链表穿起来
 63     public static Node merge(Node first, Node second){
 64         Node r = first;   //记录前面链表的尾部节点
 65         while(r.next!=null){
 66             r = r.next;
 67         }
 68         //因为second是后面链表的头节点,是空的,头节点下一个节点才是真正的节点
 69         r.next = second.next;
 70         return first;
 71     }
 72     
 73     //找到一个链表的尾节点
 74     public static Node findTail(Node node){
 75         Node r = node;   //记录前面链表的尾部节点
 76         while(r.next!=null){
 77             r = r.next;
 78         }
 79         return r;
 80     }
 81 
 82     //判断是否有环
 83     public static void judge(Node first){
 84         /**  2)判断是否有环若pq先重合则有环,若q先指向null,则无环    */
 85         Node p = first.next;
 86         Node q = first.next;
 87         String flag = "0";  //标记有环还是无环,0-无环,1-有环
 88         if(p==null){     //空链表
 89             System.out.println("链表为空!");
 90             return;
 91         }
 92         k=1;
 93         while(q.next!=null && q.next.next!=null){
 94             k++;      //记录相遇时p指针走的长度,k从0开始,因为k已经加过1了才判断pq是否相等
 95             p=p.next;
 96             q=(q.next).next;
 97             if(q.equals(p)){
 98                 flag="1";
 99                 System.out.println("p和q相遇了,这两个单链表相交!");
100                 break;
101             }
102         }
103         
104         /**  3)有环的时候求环的入口节点    */
105         if(flag.equals("1")){    //有环
106             p=first.next; //p重新指向第一个节点
107             searchEnter(p,q);
108         }
109         else{   //是因为q走到了尽头才跳出循环的,无环
110             System.out.println("这两个单链表不相交!");
111         }
112     }
113     
114     //求环的入口节点    
115     public static void searchEnter(Node p, Node q){
116         x=1;
117         while(!q.equals(p)){
118             x++;  //求圈外长度
119             p=p.next;
120             q=q.next;
121         }
122         Node r = q.next;   //为了求圈长设定的
123         y = 1;     //求圈长度
124         while(r!=q){
125             r = r.next;
126             y++;
127         }
128         System.out.println("相交节点是A链表中的第"+ x+"个节点!");
129         System.out.println("相交节点的名字为: "+ p.name);
130         System.out.println("B链表的长度是:"+ y);
131         System.out.println("第一次相遇时,慢指针在B圈内走的长度为:"+ (k-x));
132         System.out.println("第一次相遇时,快指针在B圈内走了:"+ (k/y)+"圈");
133         System.out.println("第二次相遇时,快指针在B圈内又走了:"+ (k/y-1)+"圈");
134     }
135     
136     
137     //创建一个私有的节点类
138     private static class Node {
139         public String name;
140         public Node next;
141         public Node(String name, Node next) {
142             super();
143             this.name = name;
144             this.next = next;
145         }
146     }
147 }
View Code

运行结果:

1.有交点:

p和q相遇了,这两个单链表相交!
相交节点是A链表中的第29个节点!
相交节点的名字为: 相同节点@1
B链表的长度是:6
第一次相遇时,慢指针在B圈内走的长度为:2
第一次相遇时,快指针在B圈内走了:5圈
第二次相遇时,快指针在B圈内又走了:4圈

2.无交点:

这两个单链表不相交!

转载于:https://www.cnblogs.com/wuzetiandaren/p/4251372.html

相关文章:

对抗软件系统复杂性①:如无必要,勿增实体

作者 | 袁进辉 我们经常面临如何评价一个大型软件系统质量的问题。首要的评价指标肯定是功能&#xff0c;软件是否满足主要的需求(do right things)。如果有多条技术路径可以实现同样的功能&#xff0c;人们倾向于选择更简单的办法。奥卡姆剃刀准则“如无必要&#xff0c;勿增实…

修改squid的Header中的X-Cache为Powered-By-LinuxTone

今天分析别人网站的时候&#xff0c;注意到国内的chinacache服务商的CDN加速&#xff0c;把squid默认的X-Cache修改为Powered-By-ChinaCache&#xff0c;如下图&#xff1a;以前注意了但是没去研究过&#xff0c;今天刚好有点空挡自己就来研究看看。我的squid版本&#xff1a;s…

NginxApachePHP参数汇总

1、Nginx vim /etc/nginx/conf.d/www.cmdschool.org.conf 12345678910111213client_max_body_size 30m; //上传文件大小改30M upstream www.cmdschool.org { server 10.168.82.25:87; ip_hash; } server { listen 80; server_name www.cmdschool.org; location / { proxy_pass …

android Intent PendingIntent的区别

含义&#xff1a;intent英文意思是意图&#xff0c;pending表示即将发生或来临的事情。 PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于跳转页面&#xff0c;但不是马上跳转。 Intent 是及时启动&#xff0c;intent 随所在的activity 消失而消失。…

Squid如何提高命中率

缓存命中1.缓存时间设置&#xff0c;顾名思义&#xff0c;缓存时间设置的越长那么命中率也会相对较高。缓存与更新是一对矛盾的概念&#xff0c;既要做到高命中又要做到快速更新这个就需要自己对自己网站内容的了解然后指定合适的缓存策略。2.缓存能缓存的内容&#xff0c;什么…

海量秋招面试资料等你来拿!你离大厂也许并不远

秋招在即&#xff0c;你还在为秋招如何准备而发愁吗&#xff1f;你还在为拿不到大厂offer而苦恼吗&#xff1f;工欲善其事&#xff0c;必先利其器。金秋开学季&#xff0c;CSDN助力你的技术学习与成长&#xff0c;为你免费提供海量大厂面试资料&#xff0c;让你的秋招不再慌乱&…

Microsoft Dynamics CRM server 2013 中业务规则,有点像C#的正则表达式

Microsoft Dynamics CRM server 2013 中业务规则&#xff0c;我的理解就是有点像C#的正则表达式&#xff0c; 如方某个字段&#xff0c;必须输入什么范围的数值&#xff0c;其它字符不能乱输入。 打开方式有二种&#xff1a; 1. 种像上篇文章中写的那样&#xff0c; 在系统视图…

cCodeforces Round #286 (Div. 2)

A题。。暴力枚举在每个位置添加字符&#xff0c;然后检查一下是不是回文串 1 #include <iostream>2 #include <cstdio>3 #include <cstring>4 #include <algorithm>5 #include <cmath>6 #include <vector>7 8 using namespace std;9 10 #…

Sarg安装配置使用

SARG的全称是&#xff1a;Squid Analysis Report GeneratorSARG作为一款Squid日志分析工具&#xff0c;它采用html格式&#xff0c;详细列出了每一位用户访问internet的站点信息&#xff0c;时间占用信息&#xff0c;排名&#xff0c;连接次数&#xff0c;访问量&#xff0c;访…

OpenAI 以 10 亿美元出售「灵魂」,网友热评不再「Open」

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; OpenAI 如何以 10 亿美元的价格出售其灵魂&#xff1a;GPT-3 和 Codex 背后的公司并不像它声称的那样开放。 当金钱成为障碍时&#xff0c;最好的意图可能会被破坏。 近日&#xff0c;一篇“How Open…

IBM IMM默认ID 及修改默认IP 方法

默认ID&#xff1a; http://192.168.70.125 用户名:USERID 密码:PASSW0RD (数字0) BIOS 下更改IP方法&#xff1a;&#xff08;另一种可进IMM 进行修改&#xff0c;此处不再介绍&#xff09; 本文转自easy80851CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/6…

squid 优化指南

很多squid 优化只限于在 squid参数和系统参数上面的调整。但是这个实在只是细枝末节的事情&#xff0c;只要不是太弱智的配置导致无法缓存&#xff0c;squid的性能不会有太大差距&#xff0c;也就提高10%左右&#xff0c;只有实际的业务针对squid 进行一些调整&#xff0c;squi…

Android TextView

2019独角兽企业重金招聘Python工程师标准>>> 1、TextView不用获取焦点也能实现跑马灯 public class MarqueeTextView extends TextView { Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if(focused) …

人脸识别模型的动手实践!

作者&#xff1a;宋志龙 来源&#xff1a;Datawhale人脸识别已经成为生活中越来越常见的技术&#xff0c;其中最关键的问题就是安全&#xff0c;而活体检测技术又是保证人脸识别安全性的一个重要手段&#xff0c;本文将向大家简单介绍活体检测&#xff0c;并动手完成一个活体检…

Pyqt5学习系列

最近在学习Pyqt5做界面&#xff0c;找到了一个非常棒的博主的学习系列 在此记录下来&#xff1a; http://blog.csdn.net/zhulove86/article/category/6381941

编程方式刷新Squid缓存服务器的五种方法

网站进行内容更新是常有的事情&#xff0c;当被缓存的资源更新时&#xff0c;前端Squid 缓存服务器内容也必须要相应的更新&#xff0c;否则用户就可能会看到过期的数据。当没有程序支持时就需要每次登录到服务器上执行刷新操作&#xff0c;在服务器数量小的的时候这种方式还可…

Android 实时文件夹

实时文件夹是一种用来显示由某个ContentProvider提供的数据信息的桌面组件。要创建一个实时文件夹&#xff0c;必须要有两个方面的支持。 1&#xff0c;要定义一个用来创建实时文件夹的Activity。 2&#xff0c;所指定数据信息URI的ContentProvider必须支持实时文件夹时文件夹查…

《新程序员002》图书正式上市! 从“新数据库时代”到“软件定义汽车”

20年前&#xff0c;伴随着互联网打开信息化大门&#xff0c;技术人成为新时代的开拓者。在时代的召唤下&#xff0c;CSDN于2001年推出国内首个面向IT人员的专业杂志——《程序员》&#xff0c;成为一代代开发者的技术启蒙。20年后的今天&#xff0c;人工智能、云计算、大数据等…

Xtrabackup bug记录

xtrabackup 2.1.2 2.1.3 均出现以下问题&#xff1a; 123xtrabackup: warning: Log block checksum mismatch (block no 191401143 at lsn 3946288081920):expected 800836998, calculated checksum 800832263xtrabackup: warning: this is possible when the log block has n…

RHEL5上配置VNCSERVER

VNC一个远程显示系统&#xff0c;管理员通过它不仅仅可以在运行程序的本地机上察看桌面环境&#xff0c;而且可以从 Internet上的任何地方察看远程机器的运行情况&#xff0c;而且它具有跨平台的特性。 Linux 要使用远程桌面需要安装VNC&#xff0c;Centos5,RHCE5 已经自带了VN…

勒索软件层出不穷,Veeam “3-2-1-1-0”助力构建数据防护

随着 AI、IoT、云原生等前沿技术的发展&#xff0c;近年来勒索病毒的攻击手段不断升级&#xff0c;赎金也越来越高&#xff1a;例如今年美国最大燃油管道受攻击导致美国17个州和华盛顿特区进入紧急状态&#xff0c;2020 年 Ripple20 0day 漏洞曝光&#xff0c;波及数亿台联网设…

大数据架构和模式(一)——大数据分类和架构简介

概述 大数据可通过许多方式来存储、获取、处理和分析。每个大数据来源都有不同的特征&#xff0c;包括数据的频率、量、速度、类型和真实性。处理并存储大数据时&#xff0c;会涉及到更多维度&#xff0c;比如治理、安全性和策略。选择一种架构并构建合适的大数据解决方案极具挑…

Windows 7 开发新特性

10月25日在西安举行的Windows 7 社区发布活动中我讲了Session1 -- Windows 7 概览。参会的人员达到62人&#xff0c;这个参加人数超过了我的预期,非常开心. 主要讲了一下内容: 一 构建于稳固的基础平台 1 . 改进的基础平台 兼容性: 兼容基于Windows Vista构建的应用程序与设备 …

GitHub 的 AI 编程工具漏洞高达 40% ,再次陷入争议……

整理 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 在近日发表的一篇论文中&#xff0c;研究人员对 GitHub Copilot 人工智能编程辅助工具进行了深入调查。结果发现&#xff0c;仍处于测试预览阶段的 Copilot 具有高达 40% 的错误代码率&#xff0c;意味…

centos中mysql重置密码

1 . 用空密码方式使用root用户登录 MySQL&#xff1b; mysql -u root 2. 修改root用户的密码&#xff1b; mysql> update mysql.user set passwordPASSWORD(’新密码’) where User’root’; mysql> flush privileges; mysql> quit 3. 重新启动MySQL&#xff…

Centos 内存占满 释放内存

2019独角兽企业重金招聘Python工程师标准>>> 一台服务器&#xff0c;今天用 free -m 查看&#xff0c;发现内存跑满了。 再 top&#xff0c;然后按下shiftm&#xff0c;也就是按内存占用百分比排序&#xff0c;发现排在第一的进程&#xff0c;才占用0.9%&#xff0c…

Android开发实践:为什么要继承onMeasure()

首先&#xff0c;我们写一个自定义View&#xff0c;直接调用系统默认的onMeasure函数&#xff0c;看看会是怎样的现象&#xff1a; 12345678910111213141516171819202122package com.titcktick.customview; import android.content.Context; import android.util.AttributeSet;…

Android_CodeWiki_01

记录常用代码片&#xff0c;以备不时之需..wkakak&#xff0c;开始&#xff1a; 1、 精确获取屏幕尺寸&#xff08;例如&#xff1a;3.5、4.0、5.0寸屏幕&#xff09; 1 public static double getScreenPhysicalSize(Activity ctx) { 2 DisplayMetrics dm new Displ…

centos vnc配置笔记

1.首先查询是否安装VNC Serverrpm -qa |grep vnc如果有类似于&#xff1a;vnc-server-的值返回说明已经安装了vnc-server如果没有安装采用yum安装yum -y install vnc2.配置VNC用户如果以root登录的话&#xff0c;输入vncpasswd Password:Verify:设置root用户的VNC登录用户名和密…

普通大学生和大厂的距离有多长?

随着夏季的离去&#xff0c;金九银十招聘季已经悄然而至&#xff0c;现在正处于大厂招聘高峰期&#xff0c;是找工作的好时机。对于程序员这个行业来说&#xff0c;进大厂意味着高工资、高福利以及巨大的晋升空间&#xff0c;这是普通公司无法提供的&#xff0c;因此&#xff0…