BM16 删除有序链表中重复的元素-II
生活随笔
收集整理的這篇文章主要介紹了
BM16 删除有序链表中重复的元素-II
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
描述
給出一個升序排序的鏈表,刪除鏈表中的所有重復出現的元素,只保留原鏈表中只出現一次的元素。
例如:
給出的鏈表為1→2→3→3→4→4→5, 返回1→2→5.
給出的鏈表為1→1→1→2→3, 返回2→3.
數據范圍:鏈表長度0≤n≤10000,鏈表中的值滿足 ∣val∣≤1000
要求:空間復雜度 O(n)O(n),時間復雜度 O(n)O(n)
進階:空間復雜度 O(1)O(1),時間復雜度 O(n)O(n)
方法一(刪除重復元素后存儲,并創建)
時間復雜度o(n)
空間復雜度o(n)
import java.util.*;/** public class ListNode {* int val;* ListNode next = null;* }*/public class Solution {/*** * @param head ListNode類 * @return ListNode類*/public ListNode deleteDuplicates (ListNode head) {// write code hereif(head==null) return head;Collection<Integer> c=new ArrayList<Integer>();ListNode cur=head;int tem=1001; //初始化一個臨時變量while(cur!=null){while(cur!=null&&c.contains(cur.val)){ //如果list列表中有相同的元素tem=cur.val; //暫時存儲相同的元素cur=cur.next; //跳過相同的元素,遍歷下一個節點}if(tem!=1001){c.remove(tem); //刪除list列表中那個相同的元素}if(cur!=null&&!c.contains(cur.val)){ //如果當前元素不在列表中,就加入列表中c.add(cur.val);cur=cur.next;}} // if(c.isEmpty()){ //可要可不要判斷一下 // return null; // }ListNode ph=new ListNode(0);ListNode pr=ph;for(Integer d:c){ //創建鏈表ListNode temp=new ListNode(d);temp.next=null;pr.next=temp;pr=pr.next;}return ph.next;} }方法二
在鏈表上遍歷,并直接刪除重復的元素
時間復雜度o(n)
空間復雜度o(1)
/*** struct ListNode {* int val;* struct ListNode *next;* };** C語言聲明定義全局變量請加上static,防止重復定義*/ /*** 代碼中的類名、方法名、參數名已經指定,請勿修改,直接返回方法規定的值即可** * @param head ListNode類 * @return ListNode類*/ struct ListNode* deleteDuplicates(struct ListNode* head ) {struct ListNode* dummp = (int) malloc(sizeof(int));dummp->next = head; //空節點插入鏈表頭部struct ListNode* p = dummp;while(p->next && p->next->next){ //每次都是2個節點判斷if(p->next->val == p->next->next->val){ //存在重復節點int num_flag = p->next->val; //記錄第一個重復節點的值while(p->next && p->next->val == num_flag) //循環遍歷后續節點的值,并與記錄的節點值比較,相同則逐個刪除p->next = p->next->next;}else //本輪不存在重復節點,值鏈表指針后移p = p->next;}return dummp->next; //返回結果 }總結
以上是生活随笔為你收集整理的BM16 删除有序链表中重复的元素-II的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BM15 删除有序链表中重复的元素-I
- 下一篇: BM22 比较版本号