1. 程式人生 > 其它 >[劍指Offer]:合併兩個排序的連結串列

[劍指Offer]:合併兩個排序的連結串列

技術標籤:劍指offer資料結構連結串列leetcode

文章目錄


題目描述

輸入兩個單調遞增的連結串列,輸出兩個連結串列合成後的連結串列,當然我們需要合成後的連結串列滿足單調不減規則。

示例:

輸入
{1,3,5},{2,4,6}

返回值
{1,2,3,4,5,6}

解答思路

方法一:遞迴

  1. 遞迴函式結束的條件是什麼?

對於連結串列就是,如果為空,返回什麼

  1. 遞迴函式一定是縮小遞迴區間的,那麼下一步的遞迴區間是什麼?

跟迭代方法中的一樣,如果PHead1的所指節點值小於等於pHead2所指的結點值,那麼phead1後續節點和pHead節點繼續遞迴

程式碼實現:

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        if(pHead1 == nullptr) return pHead2;
        else if(pHead2 == nullptr) return pHead1;
        
        if
(pHead1->val <= pHead2->val){ pHead1->next = Merge(pHead1->next, pHead2); return pHead1; } else{ pHead2->next = Merge(pHead1, pHead2->next); return pHead2; } } };

方法二:迭代

初始化:定義cur指向新連結串列的頭結點

操作

  • 如果l1指向的結點值小於等於l2指向的結點值,則將l1指向的結點值連結到cur的next指標,然後l1指向下一個結點值
  • 否則,讓l2指向下一個結點值
  • 迴圈步驟1,2,直到l1或者l2為nullptr
  • 將l1或者l2剩下的部分連結到cur的後面

程式碼實現:

class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        ListNode* tHead = new ListNode(1);
        ListNode* cur = tHead;
        while(pHead1 && pHead2){
            if(pHead1->val <= pHead2->val){
                cur->next = pHead1;
                pHead1 = pHead1->next;
            }
            else{
                cur->next = pHead2;
                pHead2 = pHead2->next;
            }
            cur = cur->next;
        }
        cur->next = pHead1 ? pHead1 : pHead2;
        return tHead->next;
    }
};

如有不同見解,歡迎留言討論~~~