[LeetCode]Merge Two Sorted Lists(合併兩個有序鏈表)

一、題目描述:

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

Example:

Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4

二、解題思路:

題目要求將兩個有序鏈表合併起來。

首先考慮特殊情況:有無空鏈表,如果有空表,則返回另一個鏈表頭(都空返的就是NULL)。

然後,創建一個頭指針,判斷它應該指向l1的頭還是l2的頭。

在創建一個指針用來往後走,先把它指向頭節點。然後比較l1和l2當前節點的值,指向較小的那一個,並且讓該鏈表頭指針向後走,直到有一個鏈表已經走到頭兒了。

最後,把沒走完的鏈表繼續走完就好啦。

 

三、具體實現:

/**
 * 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;
        //創建頭指針
        ListNode* head = NULL;
        if(l1->val <= l2->val){head = l1; l1 = l1->next;}
        else {head = l2; l2 = l2->next;}
        //創建用來向後歸併的指針
        ListNode* merge = head;
        while(l1 && l2){
            if(l1->val <= l2->val){
                merge->next = l1;
                l1 = l1->next;
            }else{
                merge->next = l2;
                l2 = l2->next;
            }
            merge = merge->next;
        }
        //繼續把沒歸併完的鏈表歸併完
        if(l1) merge->next = l1;
        if(l2) merge->next = l2;
        //返回歸併鏈表的頭指針
        return head;
    }
};

 

四、心得體會:

在歸併排序中我們會用到這部分功能。剛開始實現時沒有考慮到要創建兩個新的指針,一個用來向後歸併,一個用來記錄頭節點的位置,最後返回作爲結果。但是寫到後面會發現無法返回結果,所以需要兩個指針。

——————————————————————————————————————————————————

PS:另外附上評論區大神的遞歸版本

public ListNode mergeTwoLists(ListNode l1, ListNode l2){
		if(l1 == null) return l2;
		if(l2 == null) return l1;
		if(l1.val < l2.val){
			l1.next = mergeTwoLists(l1.next, l2);
			return l1;
		} else{
			l2.next = mergeTwoLists(l1, l2.next);
			return l2;
		}
}

繼續加油吧↖(^ω^)↗你闊以的!!!

 

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