0420 TIL

looggi·2023년 4월 20일
0

TILs

목록 보기
63/114
post-thumbnail

160. Intersection of Two Linked Lists

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:
        cur=headA
        cur2=headB
        while cur:
            if cur.val==headB.val:
                if cur.next and cur.next.val==headB.next.val:
                    return cur
            else:
                cur=cur.next
        while cur2:
            if headA.val==cur2.val:
                if cur2.next and cur2.next.val==headA.next.val:
                    return cur
            else:
                cur2=cur2.next

원시적으로 반복문을 2개 돌린다 -> 시간 초과

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:
        a= headA
        b= headB
        
        if headA==None or headB==None:
            return None

        while a!=b:
          if a==None:
            a=headB 
          else:
            a=a.next
          if b==None:
            b=headA
          else:
            b=b.next
            
        return a

예외처리를 따로 해주고나서.. 왜 headA를 넣는지 지하철에서 생각해보자!ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:

        if headA==None or headB==None:
            return None

        a = headA
        b = headB

        while a!=b:
            a = headB if a==None else a.next
            b = headA if b==None else b.next
        return a

이건 요약한 거

다른 풀이지만 같은 얘기다
결국에.. 이렇게 한 이유는 .. 계속 순회를 하기 위해서
즉 두 리스트 간 length difference를 없애기 위해서
하나씩 증가하기때문에 while을 두개 써서 비교해야할 거라고 생각했지만
한 리스트가 마지막에 도달했을 때, 다른 리스트를 넣어주면, 인터섹션이 아님에도 불구하고 같은 리스트라서 같은 값이 나오는 예외인 경우가 있을 것 같았으나 길이가 다르기때문에 동시에 같은 리스트의 같은 값이 나올 수는 없다. 근데 만약 최소공배수번 돌면..?
그 전에 인터섹션이 있으면 찾으려나..? 그것은 생각해볼 문제다...

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:
        l1, l2 = headA, headB# First we are taking two pointers
        while l1!=l2:  # if heads are equal this implies that we found our intersection node and then we`ll return it.
            if l1: # if list1 is there then go ahead.
                l1=l1.next # we traverse to the list to check if we found the intersection node.
            else:
                l1 = headB # if we reach to the end of the list1 then we will move our pointer to the other list head, WHY: - explained separately below.
			# above if condition in comprehension approach. 
            # l1=l1.next if l1 else headB 
            if l2:  # if list2 is there then go ahead.
                l2=l2.next # we traverse to the list to check if we found the intersection node.
            else:
                l2 = headA # if we reach to the end of the list2 then we will move our pointer to the other list head, WHY: - explained separately below.
			# above if condition in comprehension approach. 
            # l2=l2.next if l2 else headA
        return l1 # returning the pointer, we could return l2 also as we found our intersection else null.
profile
looooggi

2개의 댓글

comment-user-thumbnail
2023년 4월 23일

인터섹션이 두 리스트 각각의 마지막에 있으면 최소공배수번 돌기 전에 두번째에(리스트의 합) 바로 찾을 수 있음

답글 달기
comment-user-thumbnail
2023년 4월 24일

그리고 인터섹션 이후에 나오는 노드가 모두 같아야해서(그래야 인터섹션이긴 함..) 결국 교차점이 있으면 1번 댓글대로 됨 💗 💗

답글 달기