1. 程式人生 > >LeetCode第二題:兩樹相加(C語言)

LeetCode第二題:兩樹相加(C語言)

給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。

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

示例:

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

對於這道題,正常情況下都可以考慮到,但會出現一些特殊情況:

  • 輸入:(1 ) + (9 -> 9 -> 9) 輸出:0 -> 0 -> 0 -> 1
  • 輸入:(2 -> 4 ) + (8 ->5) 輸出:0 -> 0 -> 1

程式碼變數含義:

  • flag:進位標誌位;兩數相加大於10 flag = 1;否則flag= 0;
  • l3:指向新連結串列的某個結點
  • cur:指向新連結串列的頭結點
	//生成結點
	struct ListNode *CreateNode(int val) {
	    struct ListNode *node = (struct ListNode *)malloc(sizeof(struct ListNode));
	    node->val = val;
	    node->next = NULL;
	    return node;
	}
	
	struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
	    int flag = 0; 
	    struct ListNode* cur = NULL;
	    struct ListNode* l3 = NULL;
	    
	    while (l1 || l2) {
	        int x = l1 ? l1->val : 0;
	        int y = l2 ? l2->val : 0;
	        int sum = x + y + flag;
	        flag = sum / 10;
	        struct ListNode* node = CreateNode(sum % 10);
	        if (l3) {l3->next = node; l3 = l3->next;}
	        else {l3 = node; cur = node;}
	        if (l1) l1 = l1->next;
	        if (l2) l2 = l2->next;
	    }
	    //下面就是考慮到了上述的特殊情況
	    if (flag == 1) {
	        struct ListNode* node = CreateNode(1);
	        l3->next = node;
	    }  
	    return cur;
	}