博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
两个链表间的公共节点
阅读量:6088 次
发布时间:2019-06-20

本文共 2617 字,大约阅读时间需要 8 分钟。

题目:

输入两个链表,找出它们的第一个公共结点。

链表的形式肯定如下图所示:

 

 

暴力解法的时间复杂度为O(mn)显然不是最优的。下面介绍两种解法:

第一种思路:从后面往前数,最后一个相同的结点就是第一个相同的结点。分别把两个链表的所有节点放到两个栈里面,比较弹出栈的元素最后一个相等的节点就是第一个相同的结点。

第二种思路:先计算两个链表的结点数,计算出两个链表相差的结点数,长的链表先走相差的数,然后一起走,找到第一个相同的结点就是所求结果。

参考代码:

package test;import java.util.Stack;class ListNode {    int val;    ListNode next = null;    ListNode(int val) {        this.val = val;    }}public class Solution {    /**     * 基于栈的解法,时间复杂度为O(m+n),空间复杂度为O(m+n)     * @param pHead1     * @param pHead2     * @return     */    public ListNode FindFirstCommonNodeStack(ListNode pHead1, ListNode pHead2) {        if (pHead1 == null || pHead2 == null) return null;        Stack
stack1 = new Stack
(); Stack
stack2 = new Stack
(); ListNode p1 = pHead1; ListNode p2 = pHead2; while (p1 != null){ stack1.add(p1); p1 = p1.next; } while (p2 != null){ stack2.add(p2); p2 = p2.next; } ListNode result = null; while(!stack1.isEmpty() && !stack2.isEmpty()){ if (stack1.peek().val == stack2.peek().val){ stack1.pop(); result = stack2.pop(); }else{ return result; } } return result; } /** * 基于链表规律的解法,时间复杂度为O(m+n),空间复杂度为O(1) * @param pHead1 * @param pHead2 * @return */ public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { if (pHead1 == null || pHead2 == null) return null; ListNode longList = pHead1; ListNode shortList = pHead2; int pHead1Len = getListLen(pHead1); int pHead2Len = getListLen(pHead2); int diff = pHead1Len - pHead2Len; if (diff < 0){ longList = pHead2; shortList = pHead1; diff = pHead2Len - pHead1Len; } int longListCount = 0; while (longList != null){ if (longListCount == diff){ break; } longList = longList.next; longListCount ++; } while (longList != null && shortList != null){ if (longList.val == shortList.val){ return longList; } longList = longList.next; shortList = shortList.next; } return null; } public int getListLen(ListNode pHead){ int count = 0; while (pHead != null){ pHead = pHead.next; count ++; } return count; } }

 

转载于:https://www.cnblogs.com/tongkey/p/7815641.html

你可能感兴趣的文章
android对应版本号
查看>>
java模式之模板模式——抽象类
查看>>
[ACM] hdu 1251 统计难题 (字典树)
查看>>
Android Studio 怎样打开两个项目?
查看>>
J2EE简单的分页器
查看>>
C++面试宝典2011版
查看>>
Android开发之ListView添加多种布局效果演示
查看>>
遍历hashmap
查看>>
软件工程—团队作业1(三人行)
查看>>
vim 编辑器常用命令
查看>>
mysql 处理重复数据
查看>>
ps技术--批量给图片加水印
查看>>
http请求的全过程
查看>>
matlab练习程序(对应点集配准的四元数法)
查看>>
图像融合2
查看>>
PHP语言 -- Smarty模版基础
查看>>
iOS国际化
查看>>
使用 json_in_java
查看>>
PIC16F877A的50HZ正弦波
查看>>
linux上传文件到oss的方法
查看>>