剑指Offer-52.两个链表的第一个公共节点[简单]

64 阅读1分钟

输入两个链表,找出它们的第一个公共节点。

思路

如果两个等长的链表,很容易就能找到公共节点。只需要从头开始遍历链表节点,第一个两个链表节点的地址一样就是结果。 所以,只要让两个链表变成等长的就可以了。

代码

/**
 * 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) {
        int lengthA = length(headA);
        int lengthB = length(headB);
        int diff = Math.abs(lengthA - lengthB);
        if (lengthB > lengthA) {
            ListNode temp = headA;
            headA = headB;
            headB = temp;
        }
        for (int i = 0; i < diff; i++) {
            headA = headA.next;
        }
        while (headA != null) {
            if (headA == headB) {
                return headA;
            }
            headA = headA.next;
            headB = headB.next;
        }
        return null;
    }

    private int length(ListNode head) {
        int length = 0;
        ListNode p = head;
        while(p != null) {
            length++;
            p = p.next;
        }
        return length;
    }
}

update20210324

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        int len1 = length(headA);
        int len2 = length(headB);
        if (len2 > len1) {
            ListNode temp = headA;
            headA = headB;
            headB = temp;
        }
        int diff = Math.abs(len1 - len2);
        for (int i = 0; i < diff; i++) {
            headA = headA.next;
        }
        while (headA != headB) {
            headA = headA.next;
            headB = headB.next;
        }

        return headA;
    }

    int length(ListNode list) {
        ListNode p = list;
        int len = 0;
        while (p != null) {
            len++;
            p = p.next;
        }
        return len;
    }
}

复杂度

时间复杂度:O(m+n) 空间复杂度:O(1)

硬广告

欢迎关注公众号:double6