【演算法-java實現】合併兩個有序連結串列

hkdhkdhkd發表於2020-10-21

【演算法-java實現】合併兩個有序連結串列

一.問題描述:

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

二.問題解答:

方法:遞迴

如果 l1 或者 l2 一開始就是空連結串列 ,那麼沒有任何操作需要合併,所以我們只需要返回非空連結串列。否則,我們要判斷 l1 和 l2 哪一個連結串列的頭節點的值更小,然後遞迴地決定下一個新增到結果裡的節點。如果兩個連結串列有一個為空,遞迴結束。
本題解析:Leetcode21

覺得講的比較通俗易懂的:畫解演算法

三.演算法分析:

1.時間複雜度為O(n+m)。該問題需要對兩個連結串列的所有節點進行判斷,時間複雜度取決於兩個連結串列的節點個數。

2.額外空間複雜度為O(n+m)。遞迴的本質就是呼叫計算機棧,棧的大小取決於遞迴呼叫的深度(深度即為兩個連結串列的節點個數)。

3.遞迴:遞迴就是程式執行時自己呼叫自己,一個遞迴過程就是出入棧的過程。

使用遞迴時應該考慮1.如何設計遞迴函式 2.遞迴的終止條件

程式碼如下


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1==null){
            return l2;
        }else if(l2==null){
            return l1;
        }else if(l1.val<l2.val){
            l1.next=mergeTwoLists(l1.next,l2);
            return l1;
        }else {
            l2.next=mergeTwoLists(l1,l2.next);
            return l2;
        }
    }
}

相關文章