LeetCode160. ็›ธไบค้“พ่กจ๐ŸŒŸ๐ŸŒŸ๐ŸŒŸ๐ŸŒŸ๐ŸŒŸ็ฎ€ๅ•

่ฏพๅŽไฝœไธš

้—ฎ้ข˜ๆ่ฟฐ

ๅŽŸๆ–‡้“พๆŽฅ๏ผš160. ็›ธไบค้“พ่กจ

็ป™ไฝ ไธคไธชๅ•้“พ่กจ็š„ๅคด่Š‚็‚น headA ๅ’Œ headB ๏ผŒ่ฏทไฝ ๆ‰พๅ‡บๅนถ่ฟ”ๅ›žไธคไธชๅ•้“พ่กจ็›ธไบค็š„่ตทๅง‹่Š‚็‚นใ€‚ๅฆ‚ๆžœไธคไธช้“พ่กจไธๅญ˜ๅœจ็›ธไบค่Š‚็‚น๏ผŒ่ฟ”ๅ›ž null ใ€‚

ๅ›พ็คบไธคไธช้“พ่กจๅœจ่Š‚็‚น c1 ๅผ€ๅง‹็›ธไบค๏ผš

img

้ข˜็›ฎๆ•ฐๆฎไฟ่ฏๆ•ดไธช้“พๅผ็ป“ๆž„ไธญไธๅญ˜ๅœจ็Žฏใ€‚

ๆณจๆ„๏ผŒๅ‡ฝๆ•ฐ่ฟ”ๅ›ž็ป“ๆžœๅŽ๏ผŒ้“พ่กจๅฟ…้กปไฟๆŒๅ…ถๅŽŸๅง‹็ป“ๆž„ใ€‚

่‡ชๅฎšไน‰่ฏ„ๆต‹๏ผš

่ฏ„ๆต‹็ณป็ปŸ็š„่พ“ๅ…ฅๅฆ‚ไธ‹๏ผˆไฝ ่ฎพ่ฎก็š„็จ‹ๅบไธ้€‚็”จๆญค่พ“ๅ…ฅ๏ผ‰๏ผš

  • intersectVal – ็›ธไบค็š„่ตทๅง‹่Š‚็‚น็š„ๅ€ผใ€‚ๅฆ‚ๆžœไธๅญ˜ๅœจ็›ธไบค่Š‚็‚น๏ผŒ่ฟ™ไธ€ๅ€ผไธบ 0
  • listA – ็ฌฌไธ€ไธช้“พ่กจ
  • listB – ็ฌฌไบŒไธช้“พ่กจ
  • skipA – ๅœจ listA ไธญ๏ผˆไปŽๅคด่Š‚็‚นๅผ€ๅง‹๏ผ‰่ทณๅˆฐไบคๅ‰่Š‚็‚น็š„่Š‚็‚นๆ•ฐ
  • skipB – ๅœจ listB ไธญ๏ผˆไปŽๅคด่Š‚็‚นๅผ€ๅง‹๏ผ‰่ทณๅˆฐไบคๅ‰่Š‚็‚น็š„่Š‚็‚นๆ•ฐ

่ฏ„ๆต‹็ณป็ปŸๅฐ†ๆ นๆฎ่ฟ™ไบ›่พ“ๅ…ฅๅˆ›ๅปบ้“พๅผๆ•ฐๆฎ็ป“ๆž„๏ผŒๅนถๅฐ†ไธคไธชๅคด่Š‚็‚น headA ๅ’Œ headB ไผ ้€’็ป™ไฝ ็š„็จ‹ๅบใ€‚ๅฆ‚ๆžœ็จ‹ๅบ่ƒฝๅคŸๆญฃ็กฎ่ฟ”ๅ›ž็›ธไบค่Š‚็‚น๏ผŒ้‚ฃไนˆไฝ ็š„่งฃๅ†ณๆ–นๆกˆๅฐ†่ขซ่ง†ไฝœๆญฃ็กฎ็ญ”ๆกˆ ใ€‚

็คบไพ‹ 1๏ผš

img

่พ“ๅ…ฅ๏ผšintersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
่พ“ๅ‡บ๏ผšIntersected at '8'
่งฃ้‡Š๏ผš็›ธไบค่Š‚็‚น็š„ๅ€ผไธบ 8 ๏ผˆๆณจๆ„๏ผŒๅฆ‚ๆžœไธคไธช้“พ่กจ็›ธไบคๅˆ™ไธ่ƒฝไธบ 0๏ผ‰ใ€‚
ไปŽๅ„่‡ช็š„่กจๅคดๅผ€ๅง‹็ฎ—่ตท๏ผŒ้“พ่กจ A ไธบ [4,1,8,4,5]๏ผŒ้“พ่กจ B ไธบ [5,6,1,8,4,5]ใ€‚
ๅœจ A ไธญ๏ผŒ็›ธไบค่Š‚็‚นๅ‰ๆœ‰ 2 ไธช่Š‚็‚น๏ผ›ๅœจ B ไธญ๏ผŒ็›ธไบค่Š‚็‚นๅ‰ๆœ‰ 3 ไธช่Š‚็‚นใ€‚
โ€” ่ฏทๆณจๆ„็›ธไบค่Š‚็‚น็š„ๅ€ผไธไธบ 1๏ผŒๅ› ไธบๅœจ้“พ่กจ A ๅ’Œ้“พ่กจ B ไน‹ไธญๅ€ผไธบ 1 ็š„่Š‚็‚น (A ไธญ็ฌฌไบŒไธช่Š‚็‚นๅ’Œ B ไธญ็ฌฌไธ‰ไธช่Š‚็‚น) ๆ˜ฏไธๅŒ็š„่Š‚็‚นใ€‚ๆขๅฅ่ฏ่ฏด๏ผŒๅฎƒไปฌๅœจๅ†…ๅญ˜ไธญๆŒ‡ๅ‘ไธคไธชไธๅŒ็š„ไฝ็ฝฎ๏ผŒ่€Œ้“พ่กจ A ๅ’Œ้“พ่กจ B ไธญๅ€ผไธบ 8 ็š„่Š‚็‚น (A ไธญ็ฌฌไธ‰ไธช่Š‚็‚น๏ผŒB ไธญ็ฌฌๅ››ไธช่Š‚็‚น) ๅœจๅ†…ๅญ˜ไธญๆŒ‡ๅ‘็›ธๅŒ็š„ไฝ็ฝฎใ€‚

็คบไพ‹ 2๏ผš

img

่พ“ๅ…ฅ๏ผšintersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
่พ“ๅ‡บ๏ผšIntersected at '2'
่งฃ้‡Š๏ผš็›ธไบค่Š‚็‚น็š„ๅ€ผไธบ 2 ๏ผˆๆณจๆ„๏ผŒๅฆ‚ๆžœไธคไธช้“พ่กจ็›ธไบคๅˆ™ไธ่ƒฝไธบ 0๏ผ‰ใ€‚
ไปŽๅ„่‡ช็š„่กจๅคดๅผ€ๅง‹็ฎ—่ตท๏ผŒ้“พ่กจ A ไธบ [1,9,1,2,4]๏ผŒ้“พ่กจ B ไธบ [3,2,4]ใ€‚
ๅœจ A ไธญ๏ผŒ็›ธไบค่Š‚็‚นๅ‰ๆœ‰ 3 ไธช่Š‚็‚น๏ผ›ๅœจ B ไธญ๏ผŒ็›ธไบค่Š‚็‚นๅ‰ๆœ‰ 1 ไธช่Š‚็‚นใ€‚

็คบไพ‹ 3๏ผš

img

่พ“ๅ…ฅ๏ผšintersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
่พ“ๅ‡บ๏ผšnull
่งฃ้‡Š๏ผšไปŽๅ„่‡ช็š„่กจๅคดๅผ€ๅง‹็ฎ—่ตท๏ผŒ้“พ่กจ A ไธบ [2,6,4]๏ผŒ้“พ่กจ B ไธบ [1,5]ใ€‚
็”ฑไบŽ่ฟ™ไธคไธช้“พ่กจไธ็›ธไบค๏ผŒๆ‰€ไปฅ intersectVal ๅฟ…้กปไธบ 0๏ผŒ่€Œ skipA ๅ’Œ skipB ๅฏไปฅๆ˜ฏไปปๆ„ๅ€ผใ€‚
่ฟ™ไธคไธช้“พ่กจไธ็›ธไบค๏ผŒๅ› ๆญค่ฟ”ๅ›ž null ใ€‚

ๆ็คบ๏ผš

  • listA ไธญ่Š‚็‚นๆ•ฐ็›ฎไธบ m
  • listB ไธญ่Š‚็‚นๆ•ฐ็›ฎไธบ n
  • 1 <= m, n <= 3 * 104
  • 1 <= Node.val <= 105
  • 0 <= skipA <= m
  • 0 <= skipB <= n
  • ๅฆ‚ๆžœ listA ๅ’Œ listB ๆฒกๆœ‰ไบค็‚น๏ผŒintersectVal ไธบ 0
  • ๅฆ‚ๆžœ listA ๅ’Œ listB ๆœ‰ไบค็‚น๏ผŒintersectVal == listA[skipA] == listB[skipB]

ไปฃ็ ๅฎž็Žฐ

Java

/**
 * 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;
        }

        ListNode A = headA;
        ListNode B = headB;

        while(A != B){
            A = A == null ?headB : A.next;
            B = B == null ? headA : B.next;
        }

        return A;
    }
}

Python

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def getIntersectionNode(self, headA, headB):
        """
        :type head1, head1: ListNode
        :rtype: ListNode
        """
        if headA is None or headB is None:
            return None
        A = headA
        B = headB
        while A != B:
            A = A.next if A else headB
            B = B.next if B else headA
        return A

C++

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

        ListNode *A = headA;
        ListNode *B = headB;

        while (A != B) {
            A = A == nullptr ? headB : A->next;
            B = B == nullptr ? headA : B->next;
        }

        return A;
    }
};

Go

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func getIntersectionNode(headA, headB *ListNode) *ListNode {
    if headA == nil || headB == nil {
        return nil
    }

    A := headA
    B := headB

    for A != B {
        A = A.Next
        B = B.Next

        if A == nil && B == nil {
            return nil
        }

        if A == nil {
            A = headB
        }

        if B == nil {
            B = headA
        }
    }

    return A
}

ๅ‘่กจ่ฏ„่ฎบ

ๅŽๆ‰่ƒฝ่ฏ„่ฎบ