那几题要15刀才能测试的就先放着了。先吧可以在线测试的刷了。
这题是找到零个链表的相交的那个节点。如果没有相交,那就返回NULL。
思路一:
如果有相交,那么他们相交点之后的节点肯定都是共有的,然后两个链表有长有短的话,就先把长的读到和短的一样长,然后两个人在同时走,走到第一个相同的点就是答案了。如果相同的点是NULL了,那就是没有相交点。
/*
*
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class
Solution {
public
:
ListNode
*getIntersectionNode(ListNode *headA, ListNode *
headB) {
ListNode
*l1 = headA, *l2 =
headB;
if
(!headA || !headB)
return
NULL;
int
cnt1 =
0
, cnt2 =
0
;
while
(l1)
{
cnt1
++; l1 = l1 ->
next;
}
while
(l2)
{
cnt2
++; l2 = l2 ->
next;
}
if
(cnt1 >
cnt2)
{
l1
= headA; l2 =
headB;
int
tmpcnt1 = cnt1 -
cnt2;
while
(tmpcnt1-- >
0
)
l1
= l1 ->
next;
}
else
{
l2
= headB; l1 =
headA;
int
tmpcnt2 = cnt2 -
cnt1;
while
(tmpcnt2-- >
0
)
l2
= l2 ->
next;
}
while
(l1 && l2 && l1 !=
l2)
{
l1
= l1 ->
next;
l2
= l2 ->
next;
}
if
(l1 ==
l2)
return
l1;
return
NULL;
}
};
思路二:
因为两个链表长度可能不一样长,所以不能从第一次走一样的距离判断相交点,但是。可以这样,两个链表同时走,走到末尾后,分别将指针跳到另一个链表的开头,这样,他们第一次相同的点就是答案了。
/*
*
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class
Solution {
public
:
ListNode
*getIntersectionNode(ListNode *headA, ListNode *
headB) {
ListNode
*l1 = headA, *l2 =
headB;
if
(!headA || !headB)
return
NULL;
while
(l1 &&
l2)
{
l1
= l1 ->
next;
l2
= l2 ->
next;
}
if
(!
l1)
{
l1
=
headB;
while
(l1 &&
l2)
{
l1
= l1 ->
next;
l2
= l2 ->
next;
}
l2
=
headA;
while
(l1 && l2 && l1 !=
l2)
{
l1
= l1 ->
next;
l2
= l2 ->
next;
}
}
else
{
l2
=
headA;
while
(l1 &&
l2)
{
l1
= l1 ->
next;
l2
= l2 ->
next;
}
l1
=
headB;
while
(l1 && l2 && l1 !=
l2)
{
l1
= l1 ->
next;
l2
= l2 ->
next;
}
}
if
(l1 !=
l2)
return
NULL;
return
l1;
}
};

