如何获取两条单向链表相交部分的起始节点
问题描述
给定两条单向无环链表,有两种情况,一是两条链表为两条独立无交点链表,另一种是两条链表从某一交点开始剩余部分为公共相同的节点。编写算法,对于第一个种情况,返回null,对于第二种情况,返回两条链表公共部分的起始节点。约束:时间复杂度为O(n*m),n和m为两条链表的长度,空间复杂度为O(1)即原地操作,无需额外数据结构辅助操作。
算法实现
通过以下步骤获取两条单向无环链表的相交段起始节点:
1. 声明两个指针,分别遍历两条链表,并记录每条链表的最后一个节点;
2. 两个指针遍历完当前链表后,互换,遍历对方链表;
3. 如果两个指针指向同一个节点,则为相交段起始节点;
4. 如果两条链表最后一个节点不是同一个节点,则代表两条链表不相交。
辅助函数
编写一个函数,将一条链表转换为一个字符串,用于辅助本地测试。
本地测试
编写本地测试主方法,并运行本地测试,观察控制台输出,确保输出符合预期,本地测试通过。
示例代码
```java
// 静态内部类表示链表节点
static class ListNode {
int val;
ListNode next;
public ListNode(int val) {
val;
null;
}
}
// 获取两条链表相交部分的起始节点
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA null || headB null) {
return null;
}
ListNode pA headA;
ListNode pB headB;
while (pA ! pB) {
pA pA null ? headB : ;
pB pB null ? headA : ;
}
return pA;
}
// 将链表转换为字符串辅助函数
public String listToString(ListNode head) {
StringBuilder sb new StringBuilder();
ListNode current head;
while (current ! null) {
().append(" -> ");
current ;
}
("null");
return ();
}
// 本地测试主方法
public static void main(String[] args) {
Solution solution new Solution();
ListNode node1 new ListNode(1);
ListNode node2 new ListNode(2);
ListNode node3 new ListNode(3);
node2;
node3;
ListNode node4 new ListNode(4);
node2; // intersection point
((node1));
((node4));
ListNode result (node1, node4);
if (result ! null) {
("Intersection Node Value: " );
} else {
("No Intersection Node Found");
}
}
```
通过以上算法实现和测试代码,可以有效获取两条单向链表相交部分的起始节点。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。