Bài toán:
Cho hai danh sách liên kết lưu trữ các chữ số theo thứ tự ngược (đầu danh sách là hàng đơn vị, cuối danh sách là hàng cao nhất). Ví dụ: `l1=[2,4,3]` đại diện cho số 342 và `l2=[5,6,4]` đại diện cho số 465.
Gợi ý giải pháp:
- Tạo hai con trỏ để duyệt qua từng danh sách liên kết, lấy giá trị của mỗi nút và tính tổng tương ứng.
- Xử lý việc mang số khi cần thiết và đảm bảo thêm phần dư vào kết quả nếu còn dư sau cùng.
- Sử dụng hai con trỏ trong danh sách kết quả: một con trỏ đầu (`head`) và một con trỏ cuối (`tail`) để dễ dàng thêm các nút mới.
Mã ví dụ C++:
/**
* Định nghĩa cấu trúc danh sách liên kết.
* struct Node {
* int value;
* Node* next;
* Node() : value(0), next(nullptr) {}
* Node(int x) : value(x), next(nullptr) {}
* Node(int x, Node* nextNode) : value(x), next(nextNode) {}
* };
*/
class GiaiPhap {
public:
Node* congHaiSo(Node* ds1, Node* ds2) {
Node* dau = nullptr;
Node* cuoi = nullptr;
int du = 0;
while(ds1 || ds2){
int so1 = ds1 ? ds1->value : 0;
int so2 = ds2 ? ds2->value : 0;
int tong = so1 + so2 + du;
if(!dau){
dau = cuoi = new Node(tong % 10);
}
else{
cuoi->next = new Node(tong % 10);
cuoi = cuoi->next;
}
du = tong / 10;
if(ds1){
ds1 = ds1->next;
}
if(ds2){
ds2 = ds2->next;
}
}
if(du > 0){
cuoi->next = new Node(du);
}
return dau;
}
};
Các chi tiết mã bổ sung:
1. Biểu thức `ds1->value` trả về giá trị của nút mà con trỏ `ds1` đang trỏ đến, còn `cuoi->next` là con trỏ tới nút tiếp theo của nút mà con trỏ `cuoi` đang trỏ đến.
2. Biểu thức `int so1 = ds1 ? ds1->value : 0;` sử dụng toán tử điều kiện ba ngôi trong C++.
toan_tu_dieu_kien ? gia_tri_neu_dung : gia_tri_neu_sai;- Nếu con trỏ `ds1` không phải là null, thì lấy giá trị `value` của nút đó. - Nếu `ds1` là null, thì gán giá trị là 0. Điều này có thể viết dưới dạng:
int so1;
if (ds1 != nullptr) {
so1 = ds1->value;
} else {
so1 = 0;
}