LeetCode-160. 相交链表

不羁的心 提交于 2019-12-02 23:29:31

题目

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

例如,下面的两个链表:

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

注意:

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

解题

  • 如果两个链表相交的话, 那么链表相交的后半部分是重叠的
  • 先遍历较长的链表, 当长链表剩余的部分和短链表长度相等的时候, 同时遍历两个链表, 然后比较两个链表元素是否相等, 代码如下:
public class Solution160 {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        int lengthA = 0;
        ListNode curA = headA;
        while (curA != null){
            lengthA++;
            curA = curA.next;
        }
        int lengthB = 0;
        ListNode curB = headB;
        while (curB != null){
            lengthB++;
            curB = curB.next;
        }

        curA = headA;
        curB = headB;
        if (lengthA > lengthB) {
            for (int i = 0; i < lengthA - lengthB; i++) {
                curA = curA.next;
            }
        } else if (lengthA < lengthB) {
            curB = curB.next;
        }

        while (curA != null && curB != null) {
            if (curA == curB) {
                return  curA;
            } else {
                curA = curA.next;
                curB = curB.next;
            }
        }

        return null;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!