Leetcode - 160. 相交链表

解题思路参考代码中的注释:
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {

    // 假设A链表长度为5,B链表长度为3,那么可以定义两个指针curA和curB
    // curA从A链表的第3个节点出发,curB从B链表的第1个节点出发
    // 两个指针每次都向前走一步,两个指针第一次相遇的点即为相交的起始节点
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode curA = headA, curB = headB;

        // 计算两条链表的长度
        int lengthA = 1, lengthB = 1;
        while (curA.next != null) {
            curA = curA.next;
            lengthA++;
        }
        while (curB.next != null) {
            curB = curB.next;
            lengthB++;
        }

        // 如果两条链表的终点不同,则肯定不相交
        if (curA != curB) {
            return null;
        }
        
        // 如果链表B长度大于链表A,则交换两者的位置,保证headA指向的是长链表
        if (lengthA < lengthB) {
            ListNode temNode = headB;
            headB = headA;
            headA = temNode;

            int temLen = lengthA;
            lengthA = lengthB;
            lengthB = temLen;
        }


        // curA和curB指向各自链表的开头,并且curA先往前走lengthA - lengthB步
        curA = headA;
        curB = headB;
        for (int i = lengthA - lengthB; i > 0 ; i--) {
            curA = curA.next;
        }
        
        // 两个指针同时向前移动,直到指向相同的节点
        while (curA != curB) {
            curA = curA.next;
            curB = curB.next;
        }
        return curA;
    }
}
全部评论

相关推荐

03-02 08:18
集美大学 Java
钱嘛数字而已:没有赛事奖项么?另外,项目经历字有点多哈,建议突出一下重点:用的什么技术,解决什么问题,达到什么效果。
大家都开始春招面试了吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务