方法一:双指针

解题思路

假设链表存在相交时,headA 的长度为 a + cheadB 的长度为 b + c。如果把 headA 连上 headBheadB 连上 headB 的话,当遍历这两个新链表时有:

\[(a + c) + (b + c) = (b + c) + (a + c)
\]

而 \(a + c + b = b + c + a\),就出现相交的位置,因为 c 是相交部分的长度。

假设链表不相交,那么最后也会“相交”,“相交”于链表的尾部,即 null

代码

/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode GetIntersectionNode(ListNode headA, ListNode headB) {
ListNode pa = headA, pb = headB; while(pa != pb) {
pa = pa == null ? headB : pa.next;
pb = pb == null ? headA : pb.next;
} return pa;
}
}

复杂度分析

  • 时间复杂度:\(O(m+n)\),其中 \(m\) 是 headA 的长度, \(n\) 是 headB 的长度。
  • 空间复杂度:\(O(1)\)。

方法二:哈希表

解题思路

两次遍历,第一次遍历把 headA 的节点放到哈希表里,然后第二次遍历 headB ,判断节点是否在哈希表里,如果在,就是相交的起始点。

代码

/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode GetIntersectionNode(ListNode headA, ListNode headB) {
HashSet<ListNode> hash = new HashSet<ListNode>(); ListNode cur = headA;
while(cur != null) {
hash.Add(cur);
cur = cur.next;
} cur = headB;
while(cur != null) {
if(hash.Contains(cur)) {
break;
}
cur = cur.next;
} return cur;
}
}

复杂度分析

  • 时间复杂度:\(O(m+n)\),其中 \(m\) 是 headA 的长度, \(n\) 是 headB 的长度。
  • 空间复杂度:\(O(m)\),其中 \(m\) 是 headA 的长度。

最新文章

  1. 新建structs2 web应用及structs.xml常用基础配置
  2. js或css文件后面的参数是什么意思?
  3. netstat
  4. ASP.NET MVC 多语言实现——URL路由
  5. 关于对CSS尺寸单位&#39;em&#39;的长期误解
  6. maven总结1
  7. 利用JSONP进行水坑攻击
  8. Linux学习之nfs实例
  9. Jenkins简明入门(三) -- Blue Ocean,让一切变得简单
  10. Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署动态网站(二)--技术流ken
  11. Improved GAN
  12. Java GC机制
  13. Html5 标签三(图片)
  14. A1051. Pop Sequence
  15. 涉及不同实例不同数据库的同一条sql语句
  16. javascript节点操作appendChild()
  17. ROS+nfdump 用户上网日志
  18. (zxing.net)一维码EAN 13的简介、实现与解码
  19. Python 位运算符 逻辑运算符 成员运算符
  20. 一些参考网站 - Reference Documentation - Website Address

热门文章

  1. go 结构体与方法
  2. linux(centos8):查看操作系统的当前版本(os/kernel/bash)
  3. apache自带的ab测试失败请求原因
  4. 今天 1024,为了不 996,Lombok 用起来以及避坑指南
  5. jmeter 使用总结
  6. D. Yet Another Problem On a Subsequence 解析(DP)
  7. .net npoi读word内容+目录
  8. python打印水仙花数的个人总结
  9. Java学习的第五天
  10. 阿里云app原型设计