leetcode No.21 合并两个有序链表
生活随笔
收集整理的這篇文章主要介紹了
leetcode No.21 合并两个有序链表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
鏈接:https://leetcode-cn.com/problems/merge-two-sorted-lists
將兩個有序鏈表合并為一個新的有序鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。
示例:
輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4
C++代碼
解法1
一個最簡單的思路,新建一個指針p
將p->next指向l1和l2所指元素中較小的那個,并將對應的指針l1或l2后移
重復上面的過程直至l1或l2為NULL,將剩余部分接到p上面即可
/*** 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 = new ListNode(0);ListNode* pi = head;// l1,l2一直向后遍歷元素,向head中按序插入,直至l1或l2為NULLwhile(l1 && l2){if(l1->val < l2->val){pi->next = l1;l1 = l1->next;pi = pi->next;}else{pi->next = l2;l2 = l2->next;pi = pi->next;}}// l1或l2為NULL,此時將不會空的鏈表接到最后即可pi->next = l1 ? l1 : l2;return head->next;} };執行用時: 12ms, 在所有 C++ 提交中擊敗了 41.17% 的用戶
內存消耗: 16.8MB, 在所有 C++ 提交中擊敗了 5.07% 的用戶
不知道大家是否能夠看出上面的代碼中的問題
這個問題說小不小,說大也蠻嚴重,我們生成的頭節點不再被我們所維護,沒有任何的指針指向它,也就是發生了內存泄漏。
因此我們將代碼進行一些修改:
class Solution { public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {if(l1 == NULL) return l2;if(l2 == NULL) return l1;ListNode* head;if (l1->val < l2->val){head = l1;l1 = l1->next;}else{head = l2;l2 = l2->next;}ListNode* pi = head;// l1,l2一直向后遍歷元素,向head中按序插入,直至l1或l2為NULLwhile(l1 && l2){if(l1->val < l2->val){pi->next = l1;l1 = l1->next;pi = pi->next;}else{pi->next = l2;l2 = l2->next;pi = pi->next;}}// l1或l2為NULL,此時將不會空的鏈表接到最后即可pi->next = l1 ? l1 : l2;return head;} };解法2:遞歸
另一種很巧妙的方法是遞歸
我們讓函數只處理好當前l1和l2節點的大小關系,后面的排序通過遞歸的調用自己求解一個子問題來完成。
class Solution { 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;}l2->next = mergeTwoLists(l1, l2->next);return l2;} };兩種方法耗時基本一致,第一種更直觀,第二種方法更巧妙。
Python3代碼
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = Noneclass Solution:def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:if l1 and l2:if l1.val > l2.val: l1, l2 = l2, l1l1.next = self.mergeTwoLists(l1.next, l2)return l1 or l2總結
以上是生活随笔為你收集整理的leetcode No.21 合并两个有序链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WinSock I/O 模型 -- WS
- 下一篇: 探索比特币源码8-哈希2