leetcode.com/problems/add-two-numbers/
Add Two Numbers - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
1. Problem
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
package leetCode;
public class AddTwoNumbers {
public static void main(String[] args) {
// TODO Auto-generated method stub
ListNode resultNode = new ListNode();
// ListNode node1 = new ListNode(3);
// ListNode node2 = new ListNode(4, node1);
// ListNode node3 = new ListNode(2, node2);
// ListNode nodeA = new ListNode(4);
// ListNode nodeB = new ListNode(6, nodeA);
// ListNode nodeC = new ListNode(5, nodeB);
// resultNode = addTwoNumbers(node3, nodeC);
ListNode node1 = new ListNode(9);
ListNode node2 = new ListNode(9, node1);
ListNode node3 = new ListNode(9, node2);
ListNode node4 = new ListNode(9, node3);
ListNode node5 = new ListNode(9, node4);
ListNode node6 = new ListNode(9, node5);
ListNode node7 = new ListNode(9, node6);
ListNode nodeA = new ListNode(9);
ListNode nodeB = new ListNode(9, nodeA);
ListNode nodeC = new ListNode(9, nodeB);
ListNode nodeD = new ListNode(9, nodeC);
resultNode = addTwoNumbers(node7, nodeD);
System.out.println("");
System.out.println("==============");
printNodes(resultNode);
}
/*
* ll max < next = null
*/
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
// 기본 생성자 resultNode을 생성ㅎ면 해당 객체의 .val 멤버 변수는 0으로 자동 초기화
ListNode resultNode = new ListNode();
ListNode head = new ListNode();
head.next = resultNode;
// 첫 노드 입력이라는 신호 변수
boolean firstFlag = true;
// 자라 올림이 발생햇따는 뜻의 신호 변수 ( 다음자리수애 1을 더 해준다 )
boolean carryFlag = false;
/*
* l1과 l2 둘중 하나라도 널이 아니거나 혹은 자리올림수(carryFlag)가 발생했을떄 실행되는 반복문
*/
while(l1 != null || l2 != null || carryFlag) {
int sumVal = 0;
// 자리올림수가 있을 경우 +1 처리
if(carryFlag) {
carryFlag = false;
sumVal += 1;
}
// l1이 널이 아닐경우
if(l1 != null) {
sumVal += l1.val;
l1 = l1.next;
}
// l2이 널이 아닐경우
if(l2 != null) {
sumVal += l2.val;
l2 = l2.next;
}
// 10이상 숫자 일경우 carry 발생, 10을 나눈 후 나머지만 node에 insert
if(sumVal >= 10) {
carryFlag = true;
sumVal = sumVal%10;
}
// reverse insert
// if(firstFlag) {
// ListNode tempNode = new ListNode(sumVal);
// resultNode = tempNode;
// firstFlag = false;
// } else {
// ListNode tempNode = new ListNode(sumVal, resultNode);
// resultNode = tempNode;
// }
// nomal insert
// do~while문 대신 첫번째 노드입력할때 firstFlag 변수로 분개처리(헤드의 다음 첫 노드 val 설정)
// 첫 노드
if(firstFlag) {
resultNode.val = sumVal;
firstFlag = false;
} else { // 처음 아닌 노드
ListNode tempNode = new ListNode(sumVal);
resultNode.next = tempNode;
resultNode = resultNode.next;
}
}
return head.next;
}
public static void printNodes(ListNode l1) {
while(l1 != null) {
System.out.println(l1.val);
l1 = l1.next;
}
}
}
2. Code
AddTwoNumbers.java
istNode.java
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
3. Report
Node의 next 사용법과 NodeList 객체를 초기화 하고 선언하는 방법 고민을 오래했다.
NodeList를 만들떄 앞에 삽입, 뒤에 삽입을 구현했다.
문제 해결에는 head를 선언하여 뒤에 삽입을 사용했다.
개선점으로는 NodeList를 만들때 do~while문을 사용하면 쓸모없는 firstFlag 변수를 제거할 수 있고
가독성이 좋은 소스코드로 만들 수 있을꺼 같다.
'algorithm' 카테고리의 다른 글
[LeetCode] 28. Implement strStr() (0) | 2021.01.17 |
---|---|
[LeetCode] 58. Length Of LastWord (0) | 2021.01.14 |
[LeetCode] 9. Palindrome Number (0) | 2021.01.07 |
[LeetCode] 7. ReverseInteger (0) | 2021.01.07 |
[LeetCode] 1. TwoSum (0) | 2020.12.26 |