


该题你咋一看题目还挺长,实际上题目就一个意思,给你两个链表的结点,找到它们的相交结点,并且返回该结点
该题我思来想去,只想到一种办法——嵌套for循环(我知道效率很低)
/**
* 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* pa;
ListNode* pb;
for(pa=headA;pa;pa=pa->next)
{
for(pb=headB;pb;pb=pb->next)
{
if(pa==pb)//找到就break
{
break;
}
}
if(pa==pb)
{
break;
}
}
return pa;
}
};
最后还是看了题解,下面介绍双指针做法
我们定义两个链表指针同时开始遍历两个链表,如果某一个指针到了null,我们就让这个指针开始走另一个指针的路(当两个指针都开始走对方的路的时候,我们惊奇地发现,两个指针“距离差”被消除了!),最后只需等两个指针相等即break即可!
/**
* 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) {
if(headA==NULL||headB==NULL)
{
return NULL;
}
ListNode* pa=headA;
ListNode* pb=headB;
while(pa!=pb)//当两个指针开始走彼此的路的时候,两个指针之间的路径差便已消除
{ //后面只等二者相遇即可
if(pa==NULL)
{
pa=headB;
}
else
{
pa=pa->next;
}
if(pb==NULL)
{
pb=headA;
}
else
{
pb=pb->next;
}
}
return pa;
}
};
下面请欣赏LeetCode网友的文采~~~~
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (!headA || !headB) {
return NULL;
}
ListNode *you = headA, *she = headB;
while (you != she) { // 若是有缘,你们早晚会相遇
you = you ? you->next : headB; // 当你走到终点时,开始走她走过的路
she = she ? she->next : headA; // 当她走到终点时,开始走你走过的路
}
// 如果你们喜欢彼此,请携手一起走完剩下的旅程(将下面这个 while 块取消注释)。
// 一路上,时而你踩着她的影子,时而她踩着你的影子。渐渐地,你变成了她,她也变
// 成了你。
/* while (she) {
you = she->next;
she = you->next;
} */
return you;
}
};
本文探讨了如何高效地通过双指针技巧解决链表相交节点问题,介绍了两种不同的实现方法,从嵌套循环到优化的迭代策略,以提高算法效率。
1194

被折叠的 条评论
为什么被折叠?



