面试题02.07.链表相交
两种解题思路
- 面试题02.07.链表相交
- 一、双指针
- 二、哈希集合
一、双指针
这道题简单来说,就是求两个链表交点节点的指针
这里注意:交点不是数值相等,而是指针相等
为了方便举例,假设节点元素数值相等,则节点指针相等
看如下两个链表,如前curA指向链表A的头结点,curB指向链表B的头结点
我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到和curB对齐的位置,如图所示
此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA==curB,则找到交点
否则循环退出,返回空指针
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode curA = headA;ListNode curB = headB;int lenA = 0,lenB = 0;//求链表A的长度while(curA!=null){lenA++;curA = curA.next;}//求链表B的长度while(curB!=null){lenB++;curB = curB.next;}curA = headA;curB = headB;//让curA成为最长链表的头,lenA为其长度if(lenB>lenA){//交换lenA和lenB的值int tempLen = 0;tempLen = lenA;lenA = lenB;lenB = tempLen;//交换curA和curB指针ListNode tempNode = curA;curA = curB;curB = tempNode;}//求长度差int gap = lenA-lenB;//让curA和curB对齐while(gap>0){curA = curA.next;gap--;}//遍历curA和curB,遇见相同val值则直接返回while(curA!=null){//注意是指针相等if(curA==curB){return curA;}curA = curA.next;curB = curB.next;}return null;}
二、哈希集合
判断两个链表是否相交,可以使用哈希集合存储链表节点
首先遍历链表headA,并将链表headA中的每个节点加入到哈希集合中
然后遍历链表headB,对于遍历到的每个节点,判断该节点是否在哈希集合中
- 如果当前节点不在哈希集合中,则继续遍历下一个节点
- 如果当前节点在哈希集合中,则后面的节点都在哈希集合中,即从当前节点开始的所有节点都在两个链表的相交部分,因此在链表headB中遍历到的第一个在哈希集合中的节点就是两个链表相交的节点,返回该节点
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {Set<ListNode>visited = new HashSet<ListNode>();ListNode temp = headA;while(temp!=null){visited.add(temp);temp = temp.next;}temp = headB;while(temp!=null){if(visited.contains(temp)){return temp;}temp = temp.next;}return null;}