面试题 02.07. 链表相交

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

图示两个链表在节点 c1 开始相交:

面试题 02.07. 链表相交
面试题 02.07. 链表相交
面试题 02.07. 链表相交
思路:
先计算两个链表的长度,规定某个指针指向长链表,剩下的那个指针指向短链表,再让两个链表尾部对齐,即让指向两个链表头结点的指针处在同一起跑线上,之后遍历链表找到第一个相同的结点返回。

注意:
链表相交指的是内存地址相等而不是存放元素的数值相等,且相交后,后续结点一定也都相同。

代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA==null || headB==null) return null;

        int countA=0,countB=0;
        ListNode pA=headA,pB=headB;

        //统计A、B链条的长度
        while(pA!=null){
            countA++;
            pA=pA.next;
        }
        while(pB!=null){
            countB++;
            pB=pB.next;
        }

        pA=headA;
        pB=headB;
        // 统一规定让curA为最长链表的头,lenA为其长度
        if(countB>countA){
            //交换两个链表的长度
            int t=countA;
            countA=countB;
            countB=t;
            //交换指向两个链表的指针
            ListNode tmp=pA;
            pA=pB;
            pB=tmp;
        }
        int diff=countA-countB;

        //移动指向长链表的指针pA,让两者到同一起点
        for(int i=0;i<diff;i++){
            pA=pA.next;
        }

        //判断是否相交(找到第一个相交的节点就返回。链表相交后,后面的结点一定都相等不需比较)
        while(pA!=null){
            if(pA==pB){
                return pA;
            }
            pA=pA.next;
            pB=pB.next;
        }
        return null; 

    }
}
上一篇:竖直滚动 jquery 文字 图片


下一篇:指针变量的定义和使用