2016 - 2024

感恩一路有你

如何获取两条单向链表相交部分的起始节点

浏览量:2475 时间:2024-03-09 15:08:20 作者:采采

问题描述

给定两条单向无环链表,有两种情况,一是两条链表为两条独立无交点链表,另一种是两条链表从某一交点开始剩余部分为公共相同的节点。编写算法,对于第一个种情况,返回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");

}

}

```

通过以上算法实现和测试代码,可以有效获取两条单向链表相交部分的起始节点。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。