1、問題描述
使用兩個非空的鏈表來表示兩個非負整數,其中鏈表的每個節點存儲着數位上的一個數,且按照逆序存儲。
將兩數加和,返回一個新的鏈表來表示這兩個數的和。
您可以假設除數字0外,這兩個數都不會以0開頭。
示例:
輸入:(2->4->3)+(5->6->4)
輸出:(7->0->8)
原因:342 + 465 = 807
2、解題思路
- 邊界條件:(1)兩條鏈表皆爲空;(2)有一條鏈表爲空;(3)兩個n位數相加得到n+1位數,如55 + 60 = 125。(4)兩條鏈表的位數相差很大,如2和1453;
- 思路分析:先聲明一下所使用的數據結構,
- 三個迭代指針p1、p2,p1表示list1的迭代指針,p2表示list2的的迭代指針,p3表示加和後新鏈表的迭代指針;
- 加和後新鏈表的頭節點dummyhead;
- 進位標誌變量carry ,如果carry=true,代表需要進位;
- 初始化:剛開始令p1指向第一個鏈表list1的第一個節點,p2指向第二個鏈表list2的第一個節點;申請dummyhead節點;並令p3指向dummyhead節點
- 處理邏輯:
- p1、p2在list1、list2上進行同步迭代,如果p1、p2指向的節點均不爲空,則申請一個新的節點new_node,將p1、p2所指向的兩個節點之和賦值給new_node的值域,令p3的next指針指向new_node,p3=new_node;
- 如果p1指向的爲空,而p2指向的不爲空,則直接將p2及其後面的所有節點複製到p3後面;
- 如果p1指向的不爲空,而p2指向的爲空,則直接將p1及其後面的所有節點複製到p3後面。
3、代碼實現
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* p1;
ListNode* p2;
ListNode* p3;
bool carry;
ListNode dummyhead(0);
p1 = l1;
p2 = l2;
p3 = &dummyhead;
carry = false;
int value = 0;
ListNode* new_node = NULL;
while(p1 != NULL && p2 != NULL){
value = p1->val + p2->val;
if (carry == true){
value += 1;
}
carry = (value >= 10) ? true : false ;
if(value >= 10){
value -= 10;
}
new_node = new ListNode(value);
p3->next = new_node;
p3 = new_node;
p1 = p1->next;
p2 = p2->next;
}
while(p1 != NULL){
value = p1->val;
if(carry == true){
value += 1;
}
carry = (value >=10 ) ? true : false ;
if(value >= 10){
value -= 10;
}
new_node = new ListNode(value);
p3->next = new_node;
p3 = new_node;
p1 = p1->next;
}
while(p2 != NULL){
value = p2->val;
if(carry == true){
value += 1;
}
carry = (value >= 10) ? true : false;
if(value >= 10){
value -= 10;
}
new_node = new ListNode(value);
p3->next = new_node;
p3 = new_node;
p2 = p2->next;
}
if (carry == true){
new_node = new ListNode(1);
p3->next = new_node;
}
return dummyhead.next;
}
};