1. 程式人生 > 其它 >2021-08-01 刷題 合併兩個有序連結串列

2021-08-01 刷題 合併兩個有序連結串列

題目連結:https://leetcode-cn.com/problems/merge-two-sorted-lists/

題目說明:將兩個升序連結串列合併為一個新的 升序 連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。

題目示例:示例 1:

輸入:l1 = [1,2,4], l2 = [1,3,4]
輸出:[1,1,2,3,4,4]

示例 2:

輸入:l1 = [], l2 = []
輸出:[]

示例 3:

輸入:l1 = [], l2 = [0]
輸出:[0]


題目思路:

如上,力扣平臺已經給出了函式方法,可以使用遞迴的思想與非遞迴的思想進行解決

非遞迴思想:

1、建立虛擬頭結點與指向頭結點的指標

2、進行判斷連結串列是否為空,l1 為空怎麼解決,l2為空怎麼解決,l1、l2都不為空怎麼解決

3、l1 l2 都不為空時 需要對連結串列裡的變數進行判斷,若l1.val < l2.val 需要將p指標指向l1、l1指標指向下一個變數

程式碼:

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        //非遞迴做法
        ListNode * head = new ListNode(0);//連結串列都有虛擬的頭結點,定義虛擬的頭結點
        ListNode *p = head;//
定義一個listnode型別的指標,並指向頭結點 //1、首先判斷兩個連結串列是否為空,都不為空時 while(l1 && l2 ){ //2、判斷l1 與 l2 的值 l1 l2 為兩個指標,從0開始索引 if(l2->val > l1->val) { p->next = l1; l1=l1->next; }
else { p->next = l2; l2=l2->next; } //存入數值後,將值往後移動一位 p=p->next; } //當有L1或者L2為空時,直接將另一個連結串列中剩下的數存入p的尾部 if(l1 !=nullptr) { p->next=l1; } if(l2 !=nullptr){ p->next=l2; } return head->next; } };

遞迴程式碼:

   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;
        }
        
    }
}