1. 程式人生 > >leecode第二十一題(合並兩個有序鏈表)

leecode第二十一題(合並兩個有序鏈表)

return 有序鏈表 init link ret 判斷 spa merge 問題

技術分享圖片

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if(l1==NULL)//判斷有一組為空的情況
            return
l2; if(l2==NULL) return l1; if(l1->val>l2->val)//由於我設計的算法問題,需要明確知道第一個值誰小,不妨用l1小,若不滿足,就倒一下 return mergeTwoLists(l2,l1); ListNode* res=l1;//保存頭指針,留待返回 while(l2!=NULL) { while(l1->next!=NULL && l1->next->val<=l2->val)//
直到找出l1下一個比當前l2值大的數,且不能為空 l1=l1->next; if(l1->next==NULL)//只要額外判斷l1下個為空的情況,這個值肯定不會比l2大 { l1->next=l2; break; } ListNode* l2_next=l2->next;//一定要記住當前l2的下個節點 l2->next=l1->next;//
這裏一定要畫圖,特清晰,不畫要崩潰 l1->next=l2;//註意這裏l1指針停在新加入的節點處 l1=l1->next; l2=l2_next;//即便l2為空也不要緊啊 } return res; } };

分析:

這次做的挺好的,只有一處錯誤,就是忘了設置l1的第一個值一定小於l2的第一個值。其他沒有任何錯誤,做的如此順利的原因在於我通過畫圖舉例,盡可能把所有案例都想到了,然後對比圖示寫的(鏈表不畫圖純靠腦子我會懵),好吧其實還是這個題簡單。

這個題給我做題的經驗,就是先畫圖,舉例,實現一般功能的案例,然後是邊界,然後看算法行不,不行怎麽辦,最後總結好了再寫,不然邊寫邊想會寫不好也想不對,萬一要換算法就更麻煩了。

leecode第二十一題(合並兩個有序鏈表)