1. 程式人生 > >LinCode 165.合併兩個排序連結串列

LinCode 165.合併兩個排序連結串列

題目介紹

思路 兩個指標,分別指向兩個連結串列,從頭開始遍歷 另一個指標指向新建立的節點,將排序好的節點串聯起來 注意此題是允許重複元素的

/**
 * Definition of singly-linked-list:
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *        this->val = val;
 *        this->next = NULL;
 *     }
 * }
 */

class Solution {
public
: /** * @param l1: ListNode l1 is the head of the linked list * @param l2: ListNode l2 is the head of the linked list * @return: ListNode head of linked list */ ListNode * mergeTwoLists(ListNode * l1, ListNode * l2) { // write your code here ListNode *
pl1 = l1; ListNode *pl2 = l2; ListNode *phead = new ListNode(0); //新連結串列的頭結點 ListNode *p = phead; while (pl1!=NULL && pl2!=NULL) { if(pl1->val < pl2->val) { p->next = pl1; pl1 =
pl1->next; } else { p->next = pl2; pl2 = pl2->next; } p = p->next; } while(pl1 != NULL) { p->next = pl1; pl1 = pl1->next; p = p->next; } while(pl2 != NULL) { p->next = pl2; pl2 = pl2->next; p = p->next; } return phead->next; } };

標準答案

/**
* 本參考程式來自九章演算法,由 @九章演算法 提供。版權所有,轉發請註明出處。
* - 九章演算法致力於幫助更多中國人找到好的工作,教師團隊均來自矽谷和國內的一線大公司在職工程師。
* - 現有的面試培訓課程包括:九章演算法班,系統設計班,演算法強化班,Java入門與基礎演算法班,Android 專案實戰班,
* - Big Data 專案實戰班,演算法面試高頻題班, 動態規劃專題班
* - 更多詳情請見官方網站:http://www.jiuzhang.com/?source=code
*/ 

class Solution {
public:
    /*
    題意:合併兩個有序連結串列
    模擬一輪歸併排序
    */
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode *dummy = new ListNode(0);
        ListNode *tmp = dummy;
        while (l1 != NULL && l2 != NULL) {
            if (l1->val < l2->val) {
                tmp->next = l1;
                l1 = l1->next;
            } else {
                tmp->next = l2;
                l2 = l2->next;
            }
            tmp = tmp->next;
        }
        if (l1 != NULL) tmp->next = l1;
        else tmp->next = l2;
        return dummy->next;
    }
};

看完標答之後真的感覺自己多此一舉了,最後的迴圈賦值沒有意義,直接串聯接上就好了。 但是答案中直接改變了兩個連結串列的首地址真的好嗎?這兩個連結串列沒用了?