

最开始我的想法是分别遍历2个链表,得到2个长度。
然后2个指针再次从头开始,长链表的的指针先走差值,然后再同时走,如果碰到相等的就是相交节点。最后走到尾部两个指针都是NULL,就没有相交节点。
从效率上说,这个想法是没有问题的,但是在编程的时候就要区分哪一个长哪一个短,比较繁琐。
而代码的思路则是,让p1p2分别从listA和listB同时出发,一旦到达尾部,则跳到另一条链表的头部,继续走。
这样2个指针都要走2个链表长度的总和,但是不必区分长链表与短链表。
短链表指针正好比长链表指针早出发差值个节点。
在第2轮,两个指针必定相等,如果有相交节点,则在相交节点相等;如果没有相交节点,则在链表尾部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 *p1 = headA, *p2=headB;
while(p1!=p2){
p1=(p1==NULL)?headB:p1->next;
p2=(p2==NULL)?headA:p2->next;
}
return p1;
}
};
博客讨论了查找两个链表相交节点的方法。最初想法是遍历链表得长度,长链表指针先走差值再同时走,但编程时区分长短较繁琐。代码思路是让两指针分别从两链表出发,到尾部跳到另一链表头,第二轮两指针必定相等,可找到相交节点或判断无相交节点。
876

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



