题目
思路
自己的思路——暴力解法
- 分别遍历两个链表,记录下他们的长度s1,s2
- 长链表先走|s1-s2|,然后短链表再以相同的速度出发
- 当两个链表相等时,便是相交节点
相关代码如下:
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (!headA || !headB)
return NULL;
ListNode* A = headA;
ListNode* B = headB;
int ch1=0, ch2=0;
while (A->next) {
A = A->next;
ch1++;
}
while (B->next) {
B = B->next;
ch2++;
}
if (B != A)
return NULL;
A = headA;
B = headB;
if (ch1 > ch2) {
ch1 = ch1 - ch2;
while (ch1) {
A = A->next;
ch1--;
}
}
else {
ch2 = ch2 - ch1;
while (ch2) {
B = B->next;
ch2--;
}
}
while (B != A) {
A = A->next;
B = B->next;
}
return A;
}
};
参考思路——巧妙解题
当某个链表到达NULL时,便将指针指向另外一个链表开始遍历,如果两个链表相交,那么他们相等的节点就等于初始的相交节点(相等的节点可能为NULL),代码如下:
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
/**
定义两个指针, 第一轮让两个到达末尾的节点指向另一个链表的头部, 最后如果相遇则为交点(在第一轮移动中恰好抹除了长度差)
两个指针等于移动了相同的距离, 有交点就返回, 无交点就是各走了两条指针的长度
**/
if(headA == null || headB == null) return null;
ListNode pA = headA, pB = headB;
// 在这里第一轮体现在pA和pB第一次到达尾部会移向另一链表的表头, 而第二轮体现在如果pA或pB相交就返回交点, 不相交最后就是null==null
while(pA != pB) {
pA = pA == null ? headB : pA.next;
pB = pB == null ? headA : pB.next;
}
return pA;
}
}
这里的实质就是利用了两个链表长度之和固定,即A+B=B+A,所以遍历A+B和遍历B+A一定是同时结束的,那么他们也一定会同时到达交点,如果A,B不相交的话就返回NULL
来源:CSDN
作者:Find Our Way
链接:https://blog.csdn.net/clearLB/article/details/104224204