- vừa được xem lúc

Merge Two Sorted Lists – Từ đệ quy đến thực tiễn

0 0 1

Người đăng: Nguyễn Ánh Dung

Theo Viblo Asia

Bài Toán:

LeetCode 21: Merge Two Sorted Lists

Cho hai danh sách liên kết đã được sắp xếp tăng dần, hãy gộp chúng lại thành một danh sách liên kết mới được sắp xếp theo thứ tự tăng dần.

Ví dụ:

l1 = 1 -> 2 -> 4
l2 = 1 -> 3 -> 4
=> 1 -> 1 -> 2 -> 3 -> 4 -> 4

Vì cả hai danh sách đã được sắp xếp, ta chỉ cần duyệt qua các node để chọn ra node nhỏ hơn, rồi nối vào danh sách kết quả.

Ta sẽ triển khai theo 2 cách:

Cách 1: Dùng đệ quy

Ý tưởng:

So sánh l1.val và l2.val

Node nhỏ hơn sẽ được giữ lại, phần tiếp theo được gọi đệ quy

class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def mergeTwoLists(l1, l2): if not l1: return l2 if not l2: return l1 if l1.val < l2.val: l1.next = mergeTwoLists(l1.next, l2) return l1 else: l2.next = mergeTwoLists(l1, l2.next) return l2

Phân tích:

Thời gian: O(m + n)

Bộ nhớ: O(m + n) do call stack

Đặc điểm:

Ngắn gọn, đẹp, hợp với giáo trì học thuật

Tuy nhiên có nguy cơ stack overflow khi danh sách rất dài

Cách 2: Dùng vòng lặp (không đệ quy)

Ý tưởng:

Dùng node tạm dummy làm đầu danh sách

So sánh l1.val và l2.val, node nhỏ hơn được nối vào kết quả

Sau khi một danh sách hết, nối danh sách còn lại

def mergeTwoLists(l1, l2): dummy = ListNode(-1) current = dummy while l1 and l2: if l1.val < l2.val: current.next = l1 l1 = l1.next else: current.next = l2 l2 = l2.next current = current.next current.next = l1 if l1 else l2 return dummy.next

Phân tích:

Thời gian: O(m + n)

Bộ nhớ: O(1)

Đặc điểm:

Ổn định, an toàn

Dù danh sách dài bao nhiêu vẫn xử lý được

Khuyến nghị sử dụng trong thực tế

Nếu bạn đang làm việc với những danh sách dài hoặc trên backend server thực tế, nên dùng cách không đệ quy.

Trong phòng vấn hoặc học thuật, hiểu cả hai cách để linh hoạt tuý đối bài toán.

Mở rộng

Bài toán Merge K Sorted Lists (LeetCode 23) – sử dụng heap

Merge Sort trên linked list

So sánh Merge Sorted Arrays (LeetCode 88)

Bình luận

Bài viết tương tự

- vừa được xem lúc

Thuật toán quay lui (Backtracking)

Quay lui là một kĩ thuật thiết kế giải thuật dựa trên đệ quy. Ý tưởng của quay lui là tìm lời giải từng bước, mỗi bước chọn một trong số các lựa chọn khả dĩ và đệ quy.

0 0 58

- vừa được xem lúc

Các thuật toán cơ bản trong AI - Phân biệt Best First Search và Uniform Cost Search (UCS)

Nếu bạn từng đọc các thuật toán trong AI (Artificial Intelligence - Trí tuệ nhân tạo), rất có thể bạn từng nghe qua về các thuật toán tìm kiếm cơ bản: UCS (thuộc chiến lược tìm kiếm mù) và Best First Search (thuộc chiến lược tìm kiếm kinh nghiệm). Khác nhau rõ từ khâu phân loại rồi, thế nhưng hai th

0 0 178

- vừa được xem lúc

Sử dụng vector trong lập trình C++ - giải bài toán lập trình muôn thủa

Chào buổi tối mọi người, hôm nay lang thang trên mạng bắt gặp bài toán quen thuộc một thời của quãng đường sinh viên IT. Đấy chính là câu số 1 trong đề thi dưới đây:.

0 0 65

- vừa được xem lúc

MÔ PHỎNG THUẬT TOÁN VƯƠNG HẠO TRONG PROLOG

. 1. Các luật suy diễn trong thuật toán Vương Hạo. Luật 1: Chuyển vế các giả thuyết và kết luận ở dạng phủ định. Ví dụ: p v q, !(r ^ s), !q, p v r -> s, !p <=> p v q, p v r, p -> s, r ^ s, q.

0 0 98

- vừa được xem lúc

A* Search Algorithm

What is A* Search Algorithm. How it works. . Explanation.

0 0 61

- vừa được xem lúc

Python: Jump Search

Search là một từ khóa khá là quen thuộc đối với chúng ta. Hiểu theo đúng nghĩa đen của nó chính là "Tìm kiếm".

0 0 57