LeetCode 相交链表

编写一个程序,找到两个单链表相交的起始节点。

 

例如,下面的两个链表:

A:          a1 → a2
                   ↘
                     c1 → c2 → c3
                   ↗            
B:     b1 → b2 → b3
在节点 c1 开始相交。

 

注意:

如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
 

致谢:
特别感谢 @stellari 添加此问题并创建所有测试用例。
解法一:

首先,我们计算出两个链表的长度 countA 和 countB,然后计算出它们的差 difference,将较长的那个链表的头指针往后移动 difference 个节点,这样方便后面的遍历操作。然后遍历两个链表,判断它们的节点是否相等,这里是判断它们的引用是否相等,而不是值。因为它们如果是相交链表的话,那么它们的相交节点是同一个节点。找到之后,直接返回相交节点,否则,返回 null。

    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {

        ListNode la = headA;

        ListNode lb = headB;

        ListNode res = null;

        int countA = 0, countB = 0, difference = 0;

        while (la != null) {
            countA++;
            la = la.next;
        }

        while (lb != null) {
            countB++;
            lb = lb.next;
        }

        difference = Math.abs(countA - countB);

        if (countA >= countB) {
            for (int i = 0; i < difference; i++) {
                headA = headA.next;
            }
        } else {
            for (int i = 0; i < difference; i++) {
                headB = headB.next;
            }
        }

        while (headA != null && headB != null) {

            if (headA == headB) {
                return headA;
            }

            headA = headA.next;
            headB = headB.next;
        }
        return res;
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 编写一个程序,找到两个单链表相交的起始节点。 例如,下面的两个链表: 在节点 c1 开始相交。 注意: 如果两个链...
    壹叶壹阅读 242评论 0 0
  • 双指针,p指针先遍历A再遍历B,q指针先遍历B再遍历A,如果相交则一定会有p==q
    菜鸡学算法阅读 144评论 0 0
  • //leetcode中还有花样链表题,这里几个例子,冰山一角 求单链表中结点的个数----时间复杂度O(n)这是最...
    暗黑破坏球嘿哈阅读 1,629评论 0 6
  • 搞懂单链表常见面试题 Hello 继上次的 搞懂基本排序算法,这个一星期,我总结了,我所学习和思考的单链表基础知识...
    醒着的码者阅读 4,712评论 1 45
  • 元宵节在阿里巴巴度过 2年前的我们都很青涩,2年后都改变什么? 2年前我们一起踏入了一个公司的大门,我们满含希望,...
    墙角一朵小花阅读 175评论 0 0

友情链接更多精彩内容