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 小結
去除鏈表的重復節點值和之前去除數組重復元素的題有點類似,關於鏈表的簡單介紹在合並鏈表的題有講過,可以找找之前的文章看看。
以上就是全部內容,如果大家有什麽好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!
LeetCode算法題-Remove Duplicates from Sorted List