链表中的两数相加 发表于 2022-05-19 | 分类于 算法 , 链表 , 链表中的两数相加 | 链表中的两数相加问题 2.两数相加 I 1234567891011121314151617181920212223242526272829303132333435363738394041/** * Definition for singly-linked list. * 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) {} * }; */class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode* dummy = new ListNode(-1); ListNode* p=dummy; //进位值 int carry=0; while(l1 || l2){ //短的那个链表后面用0代替其值 int l1_val = l1 ? l1->val : 0; int l2_val = l2 ? l2->val : 0; //相加 int sum = l1_val + l2_val + carry; //更新 carry = sum/10; sum = sum%10; p->next = new ListNode(sum); p = p->next; if(l1!=nullptr) l1=l1->next; if(l2!=nullptr) l2=l2->next; } //两个链表全部遍历完毕,进位值不为0,在链表后面添加一个新结点 if(carry>0){ p->next = new ListNode(carry); } return dummy->next; }}; 123456789101112131415161718192021222324252627282930313233343536373839404142434445/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { dummy := &ListNode{Val: -1} p := dummy //进位值 carry := 0 for l1 != nil || l2 != nil { //短的那个链表后面用0代替其值 l1_val := 0 if l1 != nil { l1_val = l1.Val } l2_val := 0 if l2 != nil { l2_val = l2.Val } //相加 sum := l1_val + l2_val + carry //更新 carry = sum / 10 sum = sum % 10 p.Next = &ListNode{Val: sum} p = p.Next if l1 != nil { l1 = l1.Next } if l2 != nil { l2 = l2.Next } } //两个链表全部遍历完毕,进位值不为0,在链表后面添加一个新结点 if carry > 0 { p.Next = &ListNode{Val: carry} } return dummy.Next} 445.两数相加 II 第一种方法:借助栈 123456789101112131415161718192021222324252627282930313233343536373839404142class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { //借助栈,逆序处理所有数位 stack<int> st1, st2; while(l1){ st1.push(l1->val); l1=l1->next; } while(l2){ st2.push(l2->val); l2=l2->next; } ListNode* p=nullptr; int carry=0; //进位值 while(!st1.empty() || !st2.empty()){ int l1_val = st1.empty() ? 0 : st1.top(); int l2_val = st2.empty() ? 0 : st2.top(); if(!st1.empty()) st1.pop(); if(!st2.empty()) st2.pop(); int sum=l1_val+l2_val+carry; carry = sum/10; sum = sum%10; //反向建立单链表 ListNode* cur = new ListNode(sum); cur->next = p; p = cur; } //两个链表全部遍历完毕,进位值不为0,再添加一个新结点 if(carry>0){ ListNode* cur = new ListNode(carry); cur->next = p; p = cur; } return p; }}; 123456789101112131415161718192021222324252627282930313233343536373839404142434445func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { //借助栈,逆序处理所有数位 st1 := []int{} st2 := []int{} for l1 != nil { st1 = append(st1, l1.Val) l1 = l1.Next } for l2 != nil { st2 = append(st2, l2.Val) l2 = l2.Next } var p *ListNode carry := 0 //进位值 for len(st1) > 0 || len(st2) > 0 { l1_val := 0 if len(st1) > 0 { l1_val = st1[len(st1)-1] st1 = st1[:len(st1)-1] } l2_val := 0 if len(st2) > 0 { l2_val = st2[len(st2)-1] st2 = st2[:len(st2)-1] } sum := l1_val + l2_val + carry carry = sum / 10 sum = sum % 10 //反向建立单链表 cur := &ListNode{Val: sum} cur.Next = p p = cur } //两个链表全部遍历完毕,进位值不为0,再添加一个新结点 if carry > 0 { cur := &ListNode{Val: carry} cur.Next = p p = cur } return p} 第二种方法:借助反转链表 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { l1 = reve(l1); l2 = reve(l2); ListNode* dummy=new ListNode(-1); ListNode* p=dummy; int carry=0; while(l1 || l2){ int val1 = l1 ? l1->val : 0; int val2 = l2 ? l2->val : 0; int sum = val1+val2+carry; carry = sum/10; sum = sum%10; p->next = new ListNode(sum); p=p->next; if(l1){ l1=l1->next; } if(l2){ l2=l2->next; } } if(carry>0){ p->next = new ListNode(carry); } return reve(dummy->next); } //反转单链表 ListNode* reve(ListNode* head){ if(head==nullptr) return nullptr; ListNode* pre=nullptr; ListNode* cur=head; while(cur){ ListNode* nxt = cur->next; cur->next = pre; pre = cur; cur = nxt; } return pre; }}; 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { l1 = reve(l1) l2 = reve(l2) dummy := &ListNode{Val: -1} p := dummy carry := 0 for l1 != nil || l2 != nil { val1 := 0 if l1 != nil { val1 = l1.Val } val2 := 0 if l2 != nil { val2 = l2.Val } sum := val1 + val2 + carry carry = sum / 10 sum = sum % 10 p.Next = &ListNode{Val: sum} p = p.Next if l1 != nil { l1 = l1.Next } if l2 != nil { l2 = l2.Next } } if carry > 0 { p.Next = &ListNode{Val: carry} } return reve(dummy.Next)}//反转单链表func reve(head *ListNode) *ListNode { if head == nil { return nil } var pre *ListNode cur := head for cur != nil { nxt := cur.Next cur.Next = pre pre = cur cur = nxt } return pre} 415.字符串相加1234567891011121314151617181920212223242526class Solution {public: string addStrings(string num1, string num2) { int i=num1.size()-1; int j=num2.size()-1; int carry=0; string res=""; while(i>=0 || j>=0 || carry!=0){ int val1= i>=0 ? num1[i]-'0' : 0; int val2= j>=0 ? num2[j]-'0' : 0; int sum = val1+val2+carry; carry = sum/10; sum = sum%10; res.push_back(sum + '0'); i--; j--; } reverse(res.begin(), res.end()); return res; }}; 12345678910111213141516171819202122232425262728func addStrings(num1 string, num2 string) string { i := len(num1) - 1 j := len(num2) - 1 carry := 0 res := "" for i >= 0 || j >= 0 || carry != 0 { val1 := 0 if i >= 0 { val1 = int(num1[i] - '0') } val2 := 0 if j >= 0 { val2 = int(num2[j] - '0') } sum := val1 + val2 + carry carry = sum / 10 sum = sum % 10 res = string(rune(sum+'0')) + res i-- j-- } return res} -------------本文结束 感谢阅读------------- 本文作者: HReina 本文链接: http://hreina.com/2022/05/19/%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E4%B8%A4%E6%95%B0%E7%9B%B8%E5%8A%A0/ 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!