class Polynomial {
private:
Node* head;
public:
Polynomial() : head(nullptr) {}
// Insert a new term in descending order of powers
void insertTerm(int coeff, int power) {
Node* newNode = new Node(coeff, power);
// if list is empty or new term has highest power
if (!head || head->power < power) {
newNode->next = head;
head = newNode;
return;
}
Node* temp = head;
Node* prev = nullptr;
while (temp && temp->power > power) {
prev = temp;
temp = temp->next;
}
// if same power → combine coefficients
if (temp && temp->power == power) {
temp->coeff += coeff;
delete newNode;
} else {
newNode->next = temp;
if (prev) prev->next = newNode;
}
}
// Display the polynomial
void display() const {
Node* temp = head;
while (temp) {
cout << temp->coeff << "x^" << temp->power;
if (temp->next && temp->next->coeff >= 0) cout << " + ";
else if (temp->next) cout << " ";
temp = temp->next;
}
cout << endl;
}
// Add two polynomials
static Polynomial add(const Polynomial& p1, const Polynomial& p2) {
Polynomial result;
Node* a = p1.head;
Node* b = p2.head;
while (a || b) {
if (a && (!b || a->power > b->power)) {
result.insertTerm(a->coeff, a->power);
a = a->next;
} else if (b && (!a || b->power > a->power)) {
result.insertTerm(b->coeff, b->power);
b = b->next;
} else {
// same power
result.insertTerm(a->coeff + b->coeff, a->power);
a = a->next;
b = b->next;
}
}
return result;
}
};