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