【leetcode c++】21 Merge Two Sorted Lists

Merge two sorted linked lists and return itas a new list. The new list should be made by splicing together the nodes ofthe first two lists.

融合兩個有序的鏈表,返回這個新鏈表。

 

其實呢,這也是數據結構裏面的鏈表的題(類似多項式的加法),不過稍微比當年做的要難一點點點,因爲這裏的輸入沒有頭結點。

這次還是在leetcode網頁上面寫的,但是還是經歷了不少坎坷,最後還是要在紙上演習了一遍指針操作最後才做出來(腦補力不足→ →)。

 

我們先把【融合】放到一邊,所謂融合,在文字的概念上,應該是兩者相互融合,那麼這兩條鏈表在主動性上是等價的,這樣考慮解決方案有點迷。我們換一個說法,把一個鏈表插入到領一個鏈表裏,那麼就有插入與被插入的區別了。就跟多項式的的四則運算一樣,每個運算都有【X數】和【被X數】的區分。

 

那麼我們就分別考慮插入鏈表和被插入鏈表就好了。

我假設【插入鏈表】叫inserting,【被插入鏈表】叫inserted。

插入鏈表是肯定能插入進去的,我們只需要定位就OK了。


我們按‘對’掃描被插入鏈表,按‘個’掃描插入鏈表。如果插入的節點的大小剛好處於這對被插入節點之間,我們就做插入操作。做題的過程發現,是有相同節點的情況的,需要注意。


掃描到最後一對完畢之後,如果插入鏈表還有節點,那麼剩下的節點肯定都比被插入節點的值還要大了,只要全部接在被插入鏈表之後就可以了。


主要還是在插入的操作出了點問題,最後還是在紙上進行演習才搞定。

圖示:


*********************************************************************************************


*********************************************************************************************


*********************************************************************************************


*********************************************************************************************


*********************************************************************************************


*********************************************************************************************


*********************************************************************************************

inserted如果掃描完畢,inserting還有剩餘,直接把剩餘的inserting接到inserted後面就好了。


最後別忘了,插入操作做完之後,指針已經來到鏈表尾了,所以還要在一開始聲明一個指向被插入鏈表的指針,並返回之。

 

Leetcode的AcceptedSolutions Runtime Distribution(15-06-07)

 

源碼:

ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
    ListNode* resHead;
    ListNode* inserting;
    ListNode* inserted;
    ListNode* temp;
    if (!l1) return l2;
    if (!l2) return l1;
    if(l1->val < l2->val)
    {
        resHead = l1;
        inserted = l1;
        inserting = l2;
    }
    else
    {
        resHead = l2;
        inserted = l2;
        inserting = l1;
    }
    
    while(inserted->next && inserting)
    {
        if(inserted->val == inserting->val || 
        ((inserted->val < inserting->val) && (inserted->next->val > inserting->val)))
        {
            temp = inserted->next;
            inserted->next = inserting;
            inserting = inserting->next;
            inserted->next->next = temp;
            inserted = inserted->next;
        }
        else inserted = inserted->next;
    }
    if(inserting) inserted->next = inserting;
    
    return resHead;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章