Daily LeetCoding Challenge April, Day 4
문제
linked list에서 앞에서 K번째, 뒤에서 k번째 요소를 swapping
아이디어: 직접 탐색 + linear 순회
먼저 linked list안에 몇개의 node가 있는지 확인해야 한다. 그래야 뒤에서 부터 몇번째는 몇번의 loop를 돌아야 하는지 계산 가능하기 때문.
총 n개의 node가 있다고 하면 (n-k+1) 번의 loop를 돌면 뒤에서부터 K번째 요소이다.
이 둘의 값을 바꾸면 된다.
예외 사항
1. K == 0
2. head == NULL
하지만 문제에서 1<=k<=n<=10^5 라고 지정했으므로 위와 같은 예외사항은 처리하지 않아도 된다.
완성
submission: 333ms / 48.2MB
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* swapNodes(struct ListNode* head, int k){
int len = 0, index = 1;
int val1, val2;
struct ListNode *temp;
temp = head;
while (temp != NULL)
{
len++;
temp = temp->next;
}
temp = head;
while (index++ < k)
temp = temp->next;
val1 = temp->val;
temp = head;
index = 1;
while (index++ < len - k + 1)
temp = temp->next;
val2 = temp->val;
temp->val = val1;
temp = head;
index = 1;
while (index++ < k)
temp = temp->next;
temp->val = val2;
return head;
}
생각해보니 순회는 한번씩만 돌아도 되겠다고 생각했다.
완성2
submission: 494ms / 48.5
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
void swapping(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
struct ListNode* swapNodes(struct ListNode* head, int k){
int len = 0;
struct ListNode *start;
struct ListNode *end;
start = head;
while (start != NULL)
{
len++;
start = start->next;
}
start = head;
for(int i = 1;i < k;i++)
start = start->next;
end = head;
for(int i = 1;i < len - k + 1;i++)
end = end->next;
swapping(&start->val, &end->val);
return head;
}
코드는 클린해졌는데 왜 실행 시간이랑 메모리는 늘어날까? 당연함 외부 함수가 있어서임
'ALGORITHM > c&c++ leetcode' 카테고리의 다른 글
[C++/LeetCode] Kth Largest Element in a Stream (0) | 2022.04.08 |
---|---|
[C/LeetCode] Container With Most Water (0) | 2022.04.05 |
[C/LeetCode] Valid PalindromeⅡ (0) | 2022.04.02 |
[C/LeetCode] Search a 2D Matrix (0) | 2022.03.30 |
[C/LeetCode] Search in Rotated Sorted Array II (0) | 2022.03.28 |