leetcode - [鏈表] - (2) 兩數相加

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;
        
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章