我覺得我還是要注重一下時間的複雜度,不然怎麼叫搞演算法。。
題目:
給定乙個排序鍊錶,刪除所有重複的元素,使得每個元素只出現一次。
示例 1:
輸入: 1->1->2
輸出: 1->2
示例 2:
輸入: 1->1->2->3->3
輸出: 1->2->3
思路解答:這個題是乙個已經排好序的鍊錶了,所以只需要挨個比較刪除就好了。不需要整個的去遍歷。
c語言實現(一):
/**
* definition for singly-linked list.
* struct listnode ;
*/struct listnode* deleteduplicates(struct listnode* head)
else
p2=p2->next;
}p1->next=p2;
p1=p1->next;
}return head;
}
時間複雜度過高,導致提交審核不過,時間超出限制。
還需要優化
改進版本:
/**
* definition for singly-linked list.
* struct listnode ;
*/struct listnode* deleteduplicates(struct listnode* head)
else
p1=p1->next;
}return head;
}}
結果:
執行用時 : 12 ms, 在remove duplicates from sorted list的c提交中擊敗了84.69% 的使用者
記憶體消耗 : 7.5 mb, 在remove duplicates from sorted list的c提交中擊敗了0.76% 的使用者
這裡面當時有個leetcode報錯:member access within null pointer of type 'struct listnode'
錯誤出現原因錯誤出現原因: 因為試圖使用空指標。
解決方法解決方法:增加判斷條件,排除對空指標的引用。(一定要注意,我一直以為我排除了所有空指標的情況,其實並沒有)其實我就是先判斷了p1->next==null,但是實際上是應該先判斷p1==null。調整一下順序就ok了
Leetcode 關於鍊錶排序與元素刪除
鍊錶問題通常有兩大類思路 修改節點指標 使得它們以符合要求的順序勾連,例如鍊錶翻轉 修改節點內容 不修改節點指向,而是採取交換或修改其中節點的值 問題 刪除鍊錶中node p指向的節點 思路 由於沒有前置節點,故無法物理取消前置節點到該節點的勾連,採用下乙個節點的值覆蓋當前節點的值 實際刪除下乙個節...
leetcode 鍊錶(簡單)
鍊錶這部分的題比較簡單 21合併兩個鍊錶 類似於歸併排序,略 83刪除鍊錶中重複元素 判斷下乙個是否於當前相同,相同則跳過 listnode deleteduplicates listnode head else return head 環形鍊錶 兩種解法 是使用快慢指標,但我做的時候死迴圈了 是使...
leetcode 鍊錶排序
對鍊錶排序,用歸併排序。題目要求空間時間複雜度為o nlogn 但是空間複雜度為o 1 1.自己寫的程式,時間複雜度為o nlogn 但是空間複雜度為o n 用快慢指標 分別走2步和1步 找到中間節點。但是最後排序的部分,用複製將排好序的部分貼上會原來鍊錶中,這個方法比較笨,而且增加空間複雜度,並不...