160. 相交链表/C++

博客讨论了查找两个链表相交节点的方法。最初想法是遍历链表得长度,长链表指针先走差值再同时走,但编程时区分长短较繁琐。代码思路是让两指针分别从两链表出发,到尾部跳到另一链表头,第二轮两指针必定相等,可找到相交节点或判断无相交节点。

在这里插入图片描述
在这里插入图片描述
最开始我的想法是分别遍历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;   
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值