找出两个链表的交叉点
来源:互联网 发布:mac 任务管理工具 编辑:程序博客网 时间:2024/06/05 01:00
请写一个程序,找到两个单链表最开始的交叉节点。
注意事项
如果两个链表没有交叉,返回null。
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。样例
下列两个链表:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
在节点 c1 开始交叉。
最高效最优的方法就是从尾结点开始往前找交叉点,对于单链表来说这种方法是无法实现的.
有两种可行的方案
1.暴力搜索,直接比对所有结点,直到找出交叉点
2.将两个链表尾对齐,然后从较短的那条链开始寻找交叉点,可以做到的是找交叉点的时间复杂度为o(n),但是需要花额外的时间去求链表的长度
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { /** * @param headA: the first list * @param headB: the second list * @return: a ListNode */ public ListNode getIntersectionNode(ListNode headA, ListNode headB) { // Write your code here ListNode p1 = headA; ListNode p2 = headB; if(p1 == null || p2 == null) return null; int len1 = 0; //A链长度 while(p1.next != null) { p1 = p1.next; len1 ++; } int len2 = 0; while(p2.next != null) //B链长度 { p2 = p2.next; len2 ++; } if(p1 != p2) //相交则最后一点必然相同 return null; int le = Math.abs(len1 - len2); //长度差 if(len1 > len2) { p1 = headA; p2 = headB; } else { p1 = headB; p2 = headA; } for(int i=0; i < le; i++) //调整起点,使两条链对齐 { p1 = p1.next; } while(p1 != p2) //查找交叉点 { p1 = p1.next; p2 = p2.next; } return p1; // //暴力算法 // boolean intersec = false; // while(p1 != null) // { // while(p2 != null) // { // if(p1 == p2) // { // intersec = true; // break; // } // p2 = p2.next; // } // if(intersec) // break; // p1 = p1.next; // p2 = headB; // } // return p2; } }
0 0
- 找出两个链表的交叉点
- 判断两个链表是否交叉,并求出交叉点
- 判断两个链表是否交叉,并求出交叉点
- 判断两个链表是否交叉,并求出交叉点
- 链表交叉点
- 根据四个点坐标求两个直线的交叉点坐标
- 找出两个链表的第一个公共结点--总结
- 找出两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 找出两个链表的第一个公共结点
- 找出两个链表的第一个公共节点
- C++算法之 找出两个链表的公共节点
- 链表:找出两个链表的相交节点
- 找出两个链表的第一个公共结点
- Java笔记 - IO流(FileReader,FileWriter)
- 231. Power of Two
- 深挖SpringMVC_07_ 细说org.springframework.context.ApplicationContextAware
- 1013. 数素数 (20)
- Linux 文件符操作
- 找出两个链表的交叉点
- keychain
- LeetCode 257. Binary Tree Paths
- 小学生算术
- [BZOJ4551][Tjoi2016&Heoi2016]树 dfs序+线段树
- HDU 1043 Eight ((八数码问题)逆向BFS + 康托定理判重)
- leetcode 随机概率 水塘抽样
- PAT甲级1071
- 2016小结