처음에는 단순한 더하기 문제인줄 알고
이게 왜 Medium이지?
했었다. 그런데자료구조 - 연결리스트
에 대한 문제였고, 해당 자료구조에 대해서 이해도가 부족하다면 많이 헷갈릴 수 있겠다 싶었다. ->헷갈린 사람 == 나
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode answer = new ListNode(-1);
ListNode answerStart = answer;
int nextDigitNum = 0;
while (l1 != null || l2 != null || nextDigitNum != 0) {
int curDigitNum = 0;
int l1Val = 0;
int l2Val = 0;
if (l1 != null) {
l1Val = l1.val;
l1 = l1.next;
}
if (l2 != null) {
l2Val = l2.val;
l2 = l2.next;
}
curDigitNum += (l1Val + l2Val + nextDigitNum);
nextDigitNum = curDigitNum / 10;
curDigitNum = curDigitNum % 10;
if (answer.val == -1) {
answer.val = curDigitNum;
continue;
}
answer.next = new ListNode(curDigitNum);
answer = answer.next;
}
return answerStart;
}
}
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
C하면서 포인터를 그렇게 했지만, 그렇게나 친숙한건 아니었나보다.
DummyHaed 라는 생각을 전혀 못해서 어쩔 수 없이 반복문안에서 if문을 여러번 처리했고 그러다 보니 속도가 늦게 나왔다.
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(-1);
ListNode tail = dummyHead;
int nextDigitNum = 0;
while (l1 != null || l2 != null || nextDigitNum != 0) {
int curDigitNum = 0;
int l1Val = 0;
int l2Val = 0;
if (l1 != null) {
l1Val = l1.val;
l1 = l1.next;
}
if (l2 != null) {
l2Val = l2.val;
l2 = l2.next;
}
curDigitNum += (l1Val + l2Val + nextDigitNum);
nextDigitNum = curDigitNum / 10;
curDigitNum = curDigitNum % 10;
tail.next = new ListNode(curDigitNum);
tail = tail.next;
}
return dummyHead.next;
}
}
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
dummyHead를 사용하는 것으로 내부에서 현재 노드가 시작 노드인지 아닌지 판단하는 로직을 삭제했더니 시간이 빨라졌다.