두 singly-Linked List를 오름차순으로 하나의 리스트로 합치기
Constraints:
- The number of nodes in both lists is in the range [0, 50].
- -100 <= Node.val <= 100
- Both l1 and l2 are sorted in non-decreasing order.
1차 시도
/**
* Definition for singly-linked list.
* 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; }
* }
*/
/*
list1, list2가 null이 될 때 까지 순회하면서
임의의 ListNode가 둘 중에 작은 수를 next하게 한다.
그리고 해당 리스트는 다음 노드로 넘어간다
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode mergeList = null;
while(l1 != null || l2 != null) {
int first = 0;
int second = 0;
if(l1 != null) first = l1.val;
if(l2 != null) second = l2.val;
if(first > second) {
mergeList.next = l1;
l1 = l1.next;
} else if(second > first) {
mergeList.next = l2;
l2 = l2.next;
}else {
mergeList.next = l1;
mergeList.next = l2;
l1 = l1.next;
l2 = l2.next;
}
}
return mergeList;
}
}
Run Code Status: Runtime Error
Your input
[1,2,4]
[1,3,4]
java.lang.NullPointerException
at line 34, Solution.mergeTwoLists
내일 계속
/**
* Definition for singly-linked list.
* 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; }
* }
*/
/*
두 리스트를 하나로 정렬하기 위해서는
해당 리스트의 값을 비교하고
작은 node의 다음 행선지를 큰 node로 이어주어야 한다
그 과정에서 작은 노드쪽의 next를 가지고 있을 변수가 필요하다.
1 -> 2 -> 4
1 -> 3 -> 4
1 == 1 =>
l2.next = l1 -> 이 과정에서 l2.next가 원래 가리키던 3에대한 주소를 지우기 때문에 이를 보관할 변수가 필요
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode temp1 = new ListNode();
ListNode temp2 = new ListNode();
while(l1 != null || l2 != null) {
System.out.println(temp1);
if(l1 != null && l2 != null) {
if(l1.val > l2.val) {
temp2.next = l2.next;
l2.next = l1;
} else if(l2.val > l1.val) {
temp1.next = l1.next;
l2.next = l1;
}else if(l1.val == l2.val) {
// 이 부분 수정 해야함
mergeList = l2.next;
mergeList.next = l1;
mergeList.next = l2;
l1 = l1.next;
l2 = l2.next;
}
}else if(l1 != null && l2 == null){
mergeList.next = l1;
l1 = l1.next;
}else if(l1 == null && l2 != null){
mergeList.next = l2;
l2 = l2.next;
}
}
return mergeList;
}
}
이어주는 노드와 해당 노드의 주소를 기억할 시작 노드
작으면 이어주는 노드가 작은 리스트를 따라가고 그 다음 으로 순회
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
ListNode startNode = new ListNode();
ListNode followNode = startNode;
while(l1 != null && l2 != null) {
if(l1.val > l2.val) {
followNode.next = l2;
l2 = l2.next;
} else {
followNode.next = l1;
l1 = l1.next;
}
followNode = followNode.next;
}
if (l1 == null) followNode.next = l2;
if (l2 == null) followNode.next = l1;
return startNode.next;
}
}
Runtime: 0 ms
Memory Usage: 38.2 MB
'Algorithm > LeetCode' 카테고리의 다른 글
[LeetCode] - Linked List Cycle (0) | 2021.05.11 |
---|---|
[LeetCode] - Palindrome Linked List (0) | 2021.05.08 |
[LeetCode] - Remove Nth Node From End of List (0) | 2021.05.04 |
[LeetCode] - Delete Node in a Linked List (0) | 2021.05.03 |
[LeetCode] - Binary Tree Level Order Traversal (0) | 2021.04.29 |