1. 程式人生 > >LeetCode演算法題-Remove Duplicates from Sorted List

LeetCode演算法題-Remove Duplicates from Sorted List

這是悅樂書的第160次更新,第162篇原創

01 前情回顧

昨晚的爬樓梯演算法題,有位朋友提了個思路,使用動態規劃演算法。介於篇幅問題,這裡不細說動態規劃演算法,以後會在資料機構和演算法的理論知識裡細說。

昨晚的三個解法中,根據測試資料和結果,第三種解法是最優的,但是還能不能更進一步呢?經過推導,我們得知當n大於等於3的時候,f(n) = f(n-1)+f(n-2),也就是說我們只需要得到n的前面兩位的結果即可,對此我們使用了陣列,將每個值都存起來了,最後取出陣列中的最後一位元素。那麼是否可以將陣列也省掉,降低空間複雜度呢?答案是可以的,我們可以使用臨時變數存值。

public int climbStairs4(int n) {
    if (n == 0 || n == 1) {
        return 1;
    } 
    int a = 1;
    int b = 1;
    int temp = 0;
    for (int i=2; i<= n; i++) {
        temp = a + b;
        a = b;
        b = temp;
    }
    return temp;
}


02 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第19題(順位題號是83)。給定已排序的連結列表,刪除所有重複項,使每個元素只出現一次。例如:

輸入:1-> 1-> 2
輸出:1-> 2

輸入:1-> 1-> 2-> 3-> 3
輸出:1-> 2-> 3

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

03 第一種解法

特殊情況一:當head為空時,直接返回空。

特殊情況二:當head沒有下一個節點時,肯定是沒有重複節點值的,直接返回head本身。

正常情況:既然要判斷節點值是否重複,免不了迴圈。另外,還要考慮是否要建一個新的連結串列來連線最後去重的節點值。

首先,獲取head的下一個節點值,判斷head.val和head.next.val是否相等,如果相等,此時head節點的下一個節點應該跳到head.next.next這裡,如果不相等,那麼head節點的下一個節點只用跳到head.next即可,接著進入下一次判斷。由此,我們可以直接使用head本身,只是需要重新改變它的節點連線物件,也就是它改變原本每個節點的引用,而不需要額外使用新的空間來儲存去重後的連結串列。

public ListNode deleteDuplicates(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode first = head;
    ListNode second = first.next;
    while (second != null) {
        if (first.val == second.val) {
            second = second.next;
            first.next = second;
        } else {
            first = first.next;
            second = second.next;
        }
    }
    return head;
}


04 小結

去除連結串列的重複節點值和之前去除陣列重複元素的題有點類似,關於連結串列的簡單介紹在合併連結串列的題有講過,可以找找之前的文章看看。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!