[DSA_02] Leetcode: #19, #21
Just a note
19
Prob:
Given a linked list, remove the n-th node from the end of list and return its head.
Example:
Given linked list: 1->2->3->4->5, and n = 2.
After removing the second node from the end, the linked list becomes 1->2->3->5.
Intuition:
-
Reverse linked list (1 vòng while), delete node Nth như bình thường (1 vòng while), Reverse lại (1 vòng while) => 3 Pass (vẫn O(L), không dùng thêm space)
-
Xóa node Nth từ end <=> xóa node L - N + 1 với L là length tư head. Vậy cho chay 1 vòng while tìm L, sau đó xóa node thứ L-N+1 từ head => 2 Pass (O(L) và O(1) space)
-
Kĩ thuật 2 con trỏ: cho 1 con trỏ chạy đên Nth từ head trước, bây giờ 2 con đang cách nhau Nth. Sau đó chạy 2 con trỏ từng bước đến khi con trỏ 1 đến end, bây giờ con trỏ 2 đang ơ (L - N )th. Sau đó nối => Có thê xem là 1 pass (O(L) và O(1) space)
!Trick:
Dùng môt con trỏ gọi là dummy. Node<List_ItemType> *dummy = new Node<List_ItemType>(); dummy->next = this->head;
.
Để khi xóa phần tử đầu tiên khỏi linked list, ta không càn chia riêng trường hợp đó ra, mà dùng luôn pTemp->next (ở đây pTemp là dummy)
21
Prob:
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
Example:
Input: 1->2->4, 1->3->4 Output: 1->1->2->3->4->4
Intuition:
Tạo 1 head mới cho linkedlist sắp merge. xét lần lượt từng cặp số của 2 linked list, số nào bé hơn thì nối vào. Đên khi 1 trong 2 list rỗng, nối tất cả linked list còn lại vào merge list.