LeetCode算法题-Intersection of Two Linked Lists(Java实现)
这是悦乐书的第178次更新,第180篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第37题(顺位题号是160)。编写程序以找到两个单链表交叉的节点。例如:
以下两个链表:
A: a1→a2
↘
c1→c2→c3
↗
B:b1→b2→b3
链表A和链表B在c1处相交。
注意:
如果两个链接列表根本没有交集,则返回null。
函数返回后,链接列表必须保留其原始结构。
可以假设整个链接结构中没有任何环。
代码最好在O(n)时间内运行,并且只使用O(1)内存。
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
这两个单链表,也可以看做是两数组,找出其中重复元素开始位置的值,最直接的办法就是上两层循环,外层遍历链表A,内层循环遍历链表B,直到遇到相交的节点为止,否则返回空。
特殊情况:当两链表中有一个为空的话,直接返回空。
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) {
return null;
}
ListNode B = headB;
while (headA != null) {
while (headB != null) {
if (headA == headB) {
return headA;
}
headB = headB.next;
}
headA = headA.next;
headB = B;
}
return null;
}
但是此种解法的时间时间复杂度是O(n^2),最坏的情况是两链表的长度都是n,并且相交的节点在最后位置或者没有相交的点。
03 第二种解法
先来看个例子,假设A和B两人要比武,A的功夫等级是10级,B的功夫等级是8级,B觉得这样比武不公平,就让A把实力压制到8级,再去和B比武,此时两人的功夫等级都是8级,于是开始了一场惊天动地的比武...
回到此题中来,因为无法确定两个链表的长度是否相等,就算两者有交点,但是起点不一样,还是会错过,无法找到交点。这时,我们就需要判断两链表的长度,重新定义好起点,才能开始遍历节点。
如果链表A长度大于链表B的长度,此时链表A就需要先向前移动两者之间长度差值个节点,然后才能和B开始依次遍历比较,反之B也是如此。
public ListNode getIntersectionNode2(ListNode headA, ListNode headB) {
int len1 = findLength(headA);
int len2 = findLength(headB);
int diff = (len1 >= len2) ? (len1 - len2) : (len2 - len1);
if (len1 >= len2) {
while (diff > 0) {
headA = headA.next;
diff--;
}
} else {
while (diff > 0) {
headB = headB.next;
diff--;
}
}
while (headA != null || headB != null) {
if (headA == headB) {
return headA;
}
headA = headA.next;
headB = headB.next;
}
return null;
}
public int findLength(ListNode head) {
int len = 0;
while (head != null) {
len += 1;
head = head.next;
}
return len;
}
04 第三种解法
还记得之前那道判断单链表是否有环的题目吗?没错,此题我们也可以借助环的思路来解题。
当遍历A链表时,如果遍历到了最后一位节点,此时跳转到B链表的起始节点,然后开始遍历B链表;当遍历B链表时,如果遍历到了最后一位节点,此时跳转到A链表的起始节点,然后开始遍历A链表。此时就相当于在遍历一条由链表A和链表B组合起来的新链表,如果此新链表存在环,那么表示两链表是有交点的,如果遍历完都没有碰到环,说明两链表是没有交点的。
public ListNode getIntersectionNode3(ListNode headA, ListNode headB) {
if (headA == null || headB == null) {
return null;
}
ListNode A = headA;
ListNode B = headB;
while (A != B) {
if (A != null) {
A = A.next;
} else {
A = headB;
}
if (B != null) {
B = B.next;
} else {
B = headA;
}
}
return A;
}
05 小结
此题最优解法是第三种解法,其次是第二种,最差的解法是第一种。
算法专题目前已连续日更超过一个月,算法题文章37+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Intersection of Two Linked Lists(Java实现)的更多相关文章
- LeetCode算法题-Intersection of Two Arrays(Java实现-四种解法)
这是悦乐书的第207次更新,第219篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第75题(顺位题号是349).给定两个数组,编写一个函数来计算它们的交集.例如: 输入: ...
- LeetCode算法题-Intersection of Two Arrays II(Java实现)
这是悦乐书的第208次更新,第220篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第76题(顺位题号是350).给定两个数组,编写一个函数来计算它们的交集.例如: 输入: ...
- LeetCode算法题-Unique Morse Code Words(Java实现)
这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...
- LeetCode算法题-Robot Return to Origin(Java实现)
这是悦乐书的第281次更新,第298篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第149题(顺位题号是657).在2D平面上有一个从位置(0,0)开始的机器人.给定其移 ...
- LeetCode算法题-Min Cost Climbing Stairs(Java实现)
这是悦乐书的第307次更新,第327篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第176题(顺位题号是746).在楼梯上,第i步有一些非负成本成本[i]分配(0索引). ...
- LeetCode算法题-Longest Word in Dictionary(Java实现)
这是悦乐书的第303次更新,第322篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第171题(顺位题号是720).给出表示英语词典的字符串单词数组,找到单词中长度最长的单 ...
- LeetCode算法题-1-bit and 2-bit Characters(Java实现)
这是悦乐书的第302次更新,第321篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第170题(顺位题号是717).有两个特殊字符,第一个字符可以用一个比特0表示,第二个字 ...
- LeetCode算法题-Degree of an Array(Java实现)
这是悦乐书的第294次更新,第312篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第162题(顺位题号是697).给定一个由正整数组成的非空数组,该数组的度数被定义为任意 ...
- LeetCode算法题-Longest Continuous Increasing Subsequence(Java实现)
这是悦乐书的第286次更新,第303篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第154题(顺位题号是674).给定未排序的整数数组,找到最长连续增加子序列的长度.例如 ...
随机推荐
- yum一键安装企业级lamp服务环境-技术流ken
1.简介 LAMP 是Linux Apache MySQL PHP的简写,其实就是把Apache, MySQL以及PHP安装在Linux系统上,组成一个环境来运行动态的脚本文件. 2.系统环境 cen ...
- Linux命令-基本变量类型及其运算
[root@Redis01 ~]# cd /install/[root@Redis01 install]# mkdir -p test && cd test -s修改时间:[root@ ...
- Java并发(一)—— 使用多线程
Java的线程机制是抢占式的,所谓的抢占式指的是每一个线程都会被分配一个指定大小的时间片,一旦这个时间片用完,就会通过上下文切换到另一个线程上去. 并发是主要是为了提高单处理器的性能.创建一个线程会有 ...
- SQLite占用资源少原因
本篇承接上篇SQLite详解的下篇,介绍SQLIte为什么占用资源少的原因?本文主要参考https://blog.csdn.net/hanyingzhong/article/details/46400 ...
- RNN入门(三)利用LSTM生成旅游点评
介绍 前几天,某个公众号发文质疑马蜂窝网站,认为它搬运其它网站的旅游点评,对此,马蜂窝网站迅速地做出了回应.相信大多数关注时事的群众已经了解了整个事情的经过,在这里,我们且不论这件事的是是非非,也 ...
- 【转载】C#生成图片的缩略图
图片处理是C#程序开发中时常会涉及到的一个业务,除了图像的上传.保存以及下载等功能外,根据上传的图片生成一个缩略图也是常见业务,在C#语言中,可以通过Image类提供的相关方法对图片进行操作,如指定宽 ...
- EF C# ToPagedList方法 The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must ……
报错信息:The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' ...
- ASP.NET Core中的Startup类
ASP.NET Core程序要求有一个启动类.按照惯例,启动类的名字是 "Startup" .Startup类负责配置请求管道,处理应用程序的所有请求.你可以指定在Main方法中使 ...
- springMVC_01认识springMVC
一. MVC作用 将url映射到java类或者java类的方法 封装用户提交的数据 处理请求,调用相关业务处理,封装响应的数据 将响应数据进行渲染 一. SpringMVC 是一个轻量级的,基 ...
- 汇编语言--微机CPU的指令系统(五)(转移指令)
(9)转移指令 转移指令是汇编语言程序员经常使用的一组指令.在高级语言中,时常有“尽量不要使用转移语句”的劝告,但如果在汇编语言的程序中也尽量不用转移语句,那么该程序要么无法编写,要么没有多少功能,所 ...