• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

Merge k Sorted lists 문제에서 p 관련 질문있습니다.

19.09.29 17:09 작성 조회수 79

0

개인적으로 자료구조 sort 같은거 java로 구현하면서 연습했었을 때부터 이해가 조금 안되었어서 질문합니다.

9분15초 경부터 p관련해서 말씀해주셨는데요.
43줄에 p.next = node; 는
처음에 p가 o 을 가리키고 있으므로, p.next는 poll()했던  node 1을 넣어서 저렇게 된건 이해가 가는데요.
이 직후에, p.next는 1을 가리키고 있고, p는 0을 가리키고 있잖아요.

그런데 44줄에 p = p.next; 에서는
p.next의 다음 포인터를 p(2번째 1)로 바꿔준다고 하셨는데, 이때 p는 0을 가리키고 있지 않나요?
그러므로, p.next.next를 새로운 p로 가르켜야 새로운 포인터 지정이 맞는거 아닌가요?

제 논리에서 어디가 틀렸는지 잘 모르겠고, 선생님께서 하신 표현방식이 잘 이해가 안되서 java의 '포인터개념' 에 대해서 여쭙고 싶습니다.


갑자기 질문을 작성하다가 문득 생각이 났는데,
1). p.next=node; 은 포인터라기보다는 그냥 p(0가리킴)의 next 자리에 node를 넣고,

2). p=p.next;는 그 node 넣은 p.next 자리를 p가 가리키도록 해라.

이게 맞나요..?ㅋㅋㅋ
선생님께서 말씀하신거 우선 생각하지 않고, 혼자서
생각해봤는데 갑자기 질문작성하다가 떠올라서 ..



+ 그리고 추가 질문으로,
main 메소드 부분에, ListNode[] list 를 크기가 3으로 설정한 후에 l1 l2 l3를 배열의 요소로 넣으셨는데, 배열의 요소(1개 단위)로 node가여러개 연결된(1-4-5 같은 리스트) 게 들어갈 수 있는 건가요?
배열의 타입형이 ListNode여서 그런건가요?

글이 두서가 없고 질문이 많아 죄송합니다. !!

답변 2

·

답변을 작성해보세요.

0

음 조금 헷갈리는데, p, p.next, node 가 ListNode로 다 같은 타입형이면 '포인트' 개념은 필요없는걸까요?


p.next = node; 는 poll한 node를 p.next 자리에 넣는것.
p = p.next;는 ListNode 타입의 p.next를 ListNode 타입의 p로 하겠다 !  
이렇게 정리했는데, 그럼 바꿔서

p.next = node; 는 ListNode 타입의 node를 ListNode 타입의 `p.next 로 하겠다라고 말해도 되는건가요..?

올려주신 소스코드에서 p, p.next, node 다 ListNode 타입으로 하셨는데,
자꾸 링크드 리스트 구조를 손으로 그려보면, node는 그냥 말그대로 node고
p 와 p.next는 pointer 같이 생각이 들어서요 ㅠㅠ!

0

1. 배열의 타입형이 ListNode여서 그런건가요?

네 배열타입을 ListNode로 방3개를 만들었습니다.

값은 ListNode타입 1-4-5,1-3-4, 2-6 이렇게 들어 있는거죠

2. 기본적으로 이해하실게 p 나 p.next 는 타입이 ListNode입니다 이 전제사항을 먼저 이해하시면 편합니다.(항상 명심해야죠.)

.next를 이용해서 한칸씩 다음 ListNode를 지정하는거죠. 우리는 이것만 이용합니다. 

아래 부분이 핵심이죠

p.next = node;

p = p.next;

먼저

p.next = node 

=> node의값을 현재 p.next에 넘깁니다 즉,  1-4-5 = 1-4-5 이렇게 되겠죠?(둘은 타입이 ListNode로 같죠)

p = p.next;

=> 이건 현재 p.next포인트가 p로 된다. while문이니까 next를 이용해서 p를 셋팅해주는거죠(다음 칸으로 이동 개념)

이부분이 헷갈리면 AddTwoNumbers를 보시면 됩니다. 

아래 검은 부분 보이십니까? 작업을 마치후에 p.next를 이용해서 다음 칸으로 이동하는거죠~

참고)

while(p1 !=null || p2 != null) {

if(p1 !=null) {

carry +=p1.val;

p1 = p1.next;

}

if(p2 != null) {

carry += p2.val;

p2 = p2.next;

}

p3.next = new ListNode(carry%10);

p3 = p3.next;

carry /=10;

}