面试题02.07 链表相交

题目大概练过leetcode的链表部分估计都做过这道题;

示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

分析:

我感觉这道题凡是练过leetcode的链表模块的人都应该做过。一种很直观的思路就是首先分配遍历两个链表,获取两个链表的长度后,然后在调整遍历,达到两个链表在初始遍历时的长度的一致性,然后再次分别对两个链表分别进行遍历,判断是否存在从某个点后两个链表对应的值都是相等的,如果存在这种情况,两个链表存在相交的情况,否则就不存在;

上述解法有点麻烦,这里还有一种不容易想到的解法,拿一支笔,画一下就出来了,分别遍历两个链表,当遇到自身的结尾时换到对立的链表,这样如果相交了,那么起始的两个链表相等的点一定就是链表的交点,思想很巧妙,确实不容易想;

代码如下:

/**
 * 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 *p = headA;
        ListNode *q = headB;
        while(p!=q){
            p = p == NULL? headB: p->next;
            q = q == NULL? headA : q->next;
        }
        return p;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值