天天看點

LeetCode 兩數之和(2) c++, 連結清單

題目:

給出兩個 非空 的連結清單用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,并且它們的每個節點隻能存儲 一位 數字。

如果,我們将這兩個數相加起來,則會傳回一個新的連結清單來表示它們的和。

您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
           

思路: 因為這個題必須使用連結清單來寫,思路并不難,主要就是要熟悉連結清單和指針,然後就可以好好複習一下連結清單了,這些基礎知識我真是完全不記得了,完全是寫給智障的自己看的,問了大佬很多弱智的問題鴨。我就是要全部記下來,怕自己三天以後又忘了。

1. 連結清單的操作很棒的一個連結 :https://www.cnblogs.com/byonecry/p/4458821.html.

2. 首先分析這個題,連結清單1,連結清單2。如果長度一樣,就要直接相加,然後考慮進位的問題,如果長度不一樣,短的連結清單該位賦為0.

3.1  結構體中  定義 *next  是指向下一個結構體的指針;

3.2  c++中 定義一個結構體變量的方法  :  ListNode phead (0), *p = &phead ;現在的phead是一個空的頭指針,必須定義一個結構體指針取其位址

3.3 指針通路結構體 用p->   ,變量通路結構體元素 用 phead.next

3.4 p->next = new ListNode(sum%10);  p=p->next;   這個為連結清單的正常操作,生成一個新的節點,并将其連接配接起來;

3.5 至于為什麼是傳回 phead.next,因為以上的操作已經生成了一個完整的連結清單,ListNode *next 裡面依舊可以指向一個*next

代碼:

/**
 * 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 phead (0), *p = &phead;
        int sum=0;
        int a=0;  //進位
        while(l1||l2||a){ //全部為0, 才能停止循環
            int sum=(l1 ? l1->val : 0)+(l2 ? l2->val : 0)+a; //這個表示真的好棒
            a=sum/10;
           p->next = new ListNode(sum%10);
           p=p->next;
           
            l1=l1 ? l1->next : l1;  
            l2=l2 ? l2->next : l2;
        }
        
        return phead.next;
    }
};        
       
           

繼續閱讀