两个链表的第一个公共结点

题目描述

输入两个链表,找出它们的第一个公共结点。如果有公共结点,则输出它们的第一个公共结点;如果没有公共结点,则输出null即可。

链表的定义

1
2
3
4
5
6
7
8
public class ListNode {
int val;
ListNode next = null;

ListNode(int val) {
this.val = val;
}
}

思路

有公共结点的情况:

img

这个时候就计算出pHead1链表的长度,pHead2链表的长度,然后让长的链表先走它们之间长度的差值,然后pHead1和pHead2同时走,必定同时遇到(此时就是公共结点)。

无公共结点的情况:

img

这个时候也是采取跟有公共结点一样的思路,让链表长的先走它们长度的差值步数,然后让他们同时走,这个时候同时走到null,返回null即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package nowcoder;

/**
* @author god-jiang
* @date 2020/2/10 11:02
*/
public class FindFirstCommonNode {
//链表的定义
public class ListNode {
int val;
ListNode next = null;

ListNode(int val) {
this.val = val;
}
}

public ListNode findFirstCommonNode(ListNode pHead1, ListNode pHead2) {
if (pHead1 == null || pHead2 == null) {
return null;
}
int length1 = 0;
int length2 = 0;
ListNode node1 = pHead1;
ListNode node2 = pHead2;
//计算出链表pHead1和pHead2的长度
while (node1 != null) {
length1++;
node1 = node1.next;
}
while (node2 != null) {
length2++;
node2 = node2.next;
}
//让长的链表先走N步(N=Math.abs(length1-length2))
if (length1 > length2) {
int go = length1 - length2;
while (go > 0) {
go--;
pHead1 = pHead1.next;
}
} else {
int go = length2 - length1;
while (go > 0) {
go--;
pHead2 = pHead2.next;
}
}
//同时走,只要有公共结点就会遇到,没有公共结点就返回null
while (pHead1 != pHead2) {
pHead1 = pHead1.next;
pHead2 = pHead2.next;
}
return pHead1;
}
}

通过

img

总结

这道题也是中规中矩,现在已经写完了两个链表的相交情况。以前也写过环形链表的入口结点。这两个东西结合起来也是一道非常经典的题目,等下次我来分享给大家。

-------------本文结束感谢您的阅读-------------

本文标题:两个链表的第一个公共结点

文章作者:god-jiang

发布时间:2020年02月10日 - 11:33:06

最后更新:2020年02月10日 - 12:07:00

原始链接:https://god-jiang.github.io/2020/02/10/两个链表的第一个公共结点/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

创作不易,您的支持就是我坚持的动力,谢谢大家!
0%