输入两个链表,找出它们的第一个公共结点。
最短的代码,不用记长度
1
2
3
4
5
6
7
8
9
10
11
12
|
class Solution
{ public : ListNode*
FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) { ListNode
*p1 = pHead1; ListNode
*p2 = pHead2; while (p1!=p2){ p1
= (p1==NULL ? pHead2 : p1->next); p2
= (p2==NULL ? pHead1 : p2->next); } return p1; } }; |
用两个指针扫描”两个链表“,最终两个指针到达 null 或者到达公共结点。
断点运行了才完全想明白,好腻害的代码长度相同有公共结点,第一次就遍历到;没有公共结点,走到尾部NULL相遇,返回NULL
长度不同有公共结点,第一遍差值就出来了,第二遍一起到公共结点;没有公共,一起到结尾NULL。
//方法一:运用HasnMap的特性
import
java.util.HashMap;
public
class
Solution {
public
ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
ListNode
current1 = pHead1;
ListNode
current2 = pHead2;
HashMap<ListNode,
Integer> hashMap =
new
HashMap<ListNode, Integer>();
while
(current1 !=
null
)
{
hashMap.put(current1,
null
);
current1
= current1.next;
}
while
(current2 !=
null
)
{
if
(hashMap.containsKey(current2))
return
current2;
current2
= current2.next;
}
return
null
;
}
}
//方法2:
public
ListNode FindFirstCommonNodeII(ListNode pHead1, ListNode pHead2) {
ListNode
current1 = pHead1;
//
链表1
ListNode
current2 = pHead2;
//
链表2
if
(pHead1 ==
null
|| pHead2 ==
null
)
return
null
;
int
length1 = getLength(current1);
int
length2 = getLength(current2);
//
两连表的长度差
//
如果链表1的长度大于链表2的长度
if
(length1 >= length2) {
int
len = length1 - length2;
//
先遍历链表1,遍历的长度就是两链表的长度差
while
(len >
0
)
{
current1
= current1.next;
len--;
}
}
//
如果链表2的长度大于链表1的长度
else
if
(length1 < length2) {
int
len = length2 - length1;
//
先遍历链表1,遍历的长度就是两链表的长度差
while
(len >
0
)
{
current2
= current2.next;
len--;
}
}
//开始齐头并进,直到找到第一个公共结点
while
(current1!=current2){
current1=current1.next;
current2=current2.next;
}
return
current1;
}
//
求指定链表的长度
public
static
int
getLength(ListNode pHead) {
int
length =
0
;
ListNode
current = pHead;
while
(current !=
null
)
{
length++;
current
= current.next;
}
return
length;
}