题目大概练过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;
}
};