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

LeetCode算法題-Remove Duplicates from Sorted List

remove 開發 ret 是否 pub 刪除 ava 沒有 編寫

這是悅樂書的第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 小結

去除鏈表的重復節點值和之前去除數組重復元素的題有點類似,關於鏈表的簡單介紹在合並鏈表的題有講過,可以找找之前的文章看看。

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

LeetCode算法題-Remove Duplicates from Sorted List