题目描述

  输入两个链表,找出它们的第一个公共结点。下图中6为公共结点:

牛客网刷题地址

思路分析

  如果两个链表有公共节点,那么公共节点出现在两个链表的尾部。如果我们从两个链表的尾部开始往前比较,那么最后一个相同的节点就是我们要找的节点。

  1. 解决这个问题:分别把两个链表的节点放入两个栈里,这样两个链表的尾节点就位于两个栈的栈顶,接下来比较两个栈顶的节点是否相同。如果相同,则把栈顶弹出接着比较下一个栈顶,直到找到最后一个相同的节点。
  2. 首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个节点。在第二次遍历的时候,在较长的链表上先走若干步,接着同时在两个链表上遍历,找到的第一个相同的节点就是它们的第一个公共节点。

测试用例

  1. 功能测试:输入的两个链表有公共节点:第一个公共节点在链表的中间,第一个公共节点在链表的末尾,第一个公共节点是链表的头节点;输入的两个链表没有公共节点。
  2. 特殊输入测试:输入的链表头节点是nullptr指针。

Java代码

public class Offer052 {
public static void main(String[] args) {
test1();
test2();
test3(); } public static ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
return Solution1(pHead1,pHead2);
} /**
* 利用长度关系
* @param pHead1
* @param pHead2
* @return
*/
private static ListNode Solution1(ListNode pHead1, ListNode pHead2) {
int listLength1 = getListLength(pHead1);
int listLength2 = getListLength(pHead2);
int dif = listLength1-listLength2;
ListNode longList = pHead1;
ListNode shortList = pHead2;
if(listLength1<listLength2) {
longList = pHead2;
shortList = pHead1;
dif = listLength2-listLength1;
}
for(int i=0;i<dif;i++) {
longList = longList.next;
}
while(longList!=null && shortList!=null && longList!=shortList) {
longList = longList.next;
shortList = shortList.next;
}
ListNode firstCommonFirst = longList; return firstCommonFirst;
} private static int getListLength(ListNode pHead1) {
int length = 0;
while(pHead1!=null) {
length++;
pHead1 = pHead1.next;
}
return length;
} private static void test1() { } private static void test2() { }
private static void test3() { }
}

代码链接

剑指Offer代码-Java

最新文章

  1. CSS系列:在HTML中引入CSS的方法
  2. 转载:《TypeScript 中文入门教程》 9、泛型
  3. ionic入门01
  4. html EVENT对象
  5. 在Sqlserver下巧用行列转换日期的数据统计
  6. JavaScript中产生标识符方式的演变
  7. 转{QQ浏览器X5内核问题汇总}
  8. HDU 4293 Groups (线性dp)
  9. JsonUtil对象与json互转
  10. java利用commons-email发送邮件并进行封装
  11. 阿里如何实现海量数据实时分析技术-AnalyticDB
  12. 半导体知识:蚀刻(Etch)工艺讲解
  13. 快速解决PL/SQL Developer过期问题(无需注册码等复杂操作)
  14. 在他机上还原DB2的备份
  15. Leaflet_扩展Leaflet:类(2017-10-26)
  16. 第1节 常用DOS(磁盘操作系统)命令
  17. 【CF1132F】Clear the String (DP)
  18. [uwsgi: command not found]
  19. C/C++掌握技能(一)
  20. RPi Desktop盒子安装与服务配置

热门文章

  1. Leetcode的SQL题解:185. 部门工资前三高的员工
  2. JVM系列(1)- JVM常见参数及堆内存分配
  3. Vsftp服务器配置文件详解
  4. exe4j打包--exe转安装包
  5. 百度Echarts,蚂蚁金服G2,D3三种主流可视化工具对比
  6. 工作中常见的五种技术leader
  7. Spring Cloud Gateway 服务网关快速上手
  8. Flutter学习笔记(21)--TextField文本框组件和Card卡片组件
  9. 二级小兵——工厂模式(Factory Method)
  10. GLFW+GLAD OpenGL Mac开发环境搭建