C++兩個數相加(連結串列)
阿新 • • 發佈:2021-03-20
head 頭部不用來儲存資料的方式
思路:
\quad
使用一個結構體,用來存進位的數。
\quad
便利兩個連結串列,求和,整除的作為新節點,餘數儲存在另一個結構體中(重複使用,重複覆蓋)
\quad
最後一個進位需要單獨處理(就是重複使用,重複覆蓋的那個結構體加到連結串列末尾)
#include <iostream> using namespace std; struct ListNode { int val; ListNode *next; ListNode() : val(0), next(nullptr) {} ListNode(int x) : val(x), next(nullptr) {} ListNode(int x, ListNode *next) : val(x), next(next) {} }; //初始化列表 ListNode* InitList(ListNode *head, int *n, int length) { int a=0; ListNode *p, *s; head = new ListNode(); p=head; for (int i=0; i<length; i++) { s = new ListNode(n[i]); p->next = s; p=s; } return head; } //列印連結串列 void Print(ListNode *head) { ListNode *p; p=head->next; while(p!=nullptr){ cout<<p->val; p=p->next; } cout<<endl; } //連結串列相加 ListNode *addTwoNum(ListNode *l1, ListNode *l2) { ListNode *head, *p, *s, *m; //頭指標不裝值 head = new ListNode(); m = new ListNode(0); // 存放進位的數 p = head; //兩數相加 while(l1->next!=nullptr || l2->next!=nullptr) { if(l1->next!=nullptr && l2->next!=nullptr) { l1 = l1->next; l2 = l2->next; int result = l1->val + l2->val + m->val; s=new ListNode(result % 10); p->next = s; p = s; m->val = result / 10; }else if(l1->next!=nullptr){ l1 = l1->next; int temp = l1->val + m->val; s = new ListNode(temp % 10); p->next = s; p = s; m->val = temp / 10; }else if(l2->next!=nullptr){ l2 = l2->next; int temp = l2->val + m->val; s = new ListNode(temp % 10); p->next = s; p = s; m->val = temp / 10; } if(l1->next == nullptr && l2->next == nullptr && m->val > 0) //處理最後一個進位的可能 p->next = m; } return head; } int main() { ListNode *l1,*l2; // int a[]={2,4,6}; // int b[]={5,6,4}; // int a[]={9,9,9,9,9,9,9}; // int b[]={9,9,9,9}; // int a[]={0}; // int b[]={0}; int a[]={2,4,3}; int b[]={5,6,4}; l1 = InitList(l1, a, sizeof(a)/sizeof(a[1])); l2 = InitList(l2, b, sizeof(b)/sizeof(b[1])) ; Print(l2); Print(l1); ListNode *result = addTwoNum(l1,l2); Print(result); return 0; }
結果
程式碼中以陣列的方式建立連結串列,給了4組,可自行註釋、編譯、執行