【題目一】 力扣83 刪除重複的節點(保留重複的節點)
給定乙個排序鍊錶,刪除所有重複的元素,使得每個元素只出現一次。
示例 1:
輸入:1->1->2
輸出:1->2
示例 2:
輸入:1->1->2->3->3
輸出:1->2->3
【解法1】使用set去重,思路很簡單。時間複雜度o(n),空間複雜度o(n)
public static listnode deleterepeatednode1(listnode head)
listnode cur = head.next;
listnode pre = head;
setset = new hashset<>();
set.add(head.val);// 保留第乙個節點
while(cur != null)else
cur = cur.next;
} return head;
}
【解法2】遍歷鍊錶,一次去重重複的節點。
方法二:類似選擇排序的過程,時間複雜度為 o(n2),額外空間複雜度為 o(1)。
public static listnode deleterepeatednode2(listnode head) else
next = next.next;
}cur = cur.next;
} return head;
}
【題目兒】 力扣82 刪除重複的節點(不保留重複的節點)
給定乙個排序鍊錶,刪除所有含有重複數字的節點,只保留原始鍊錶中 沒有重複出現 的數字。(注意鍊錶已經排序了)
示例 1:
輸入:1->2->3->3->4->4->5
輸出:1->2->5
示例 2:
輸入:1->1->1->2->3
輸出:2->3
【解法一】使用map統計每個節點出現的次數
public static listnode deleterep1(listnode head)
cur = head;
while(cur!= null)else
cur = cur.next;
} return pre.next;
}
【解法二】使用雙指標,如果兩個指標指向的鍊錶值不相等時,兩個指標之間的距離大於0,就說明存在重複值,否則就沒有重複值。
這種情況只有乙個需要注意的地方就是temp節點更新的條件,只有len=0時才進行更新。(主要時考慮1-1-2-2-3這種情況,重複的資料的相連的,如1和2都需要刪除。)
public static listnode deleterep2(listnode head)
listnode pre = new listnode(-1);
pre.next = head;// 設定哨兵節點
listnode temp = pre;
listnode cur = head;
listnode next = cur.next;
int len = 0;// next節點和cur節點之間的距離,大於1則有重複節點
while (next != null)
if (len == 0) else
cur = next;
if (next != null) next = cur.next;//注意為節點的判斷
} return pre.next;
}
刪除鍊錶的重複節點
思路 就是找到不重複出現的節點,然後連線到新鍊錶上面 反思 在連線節點到新鍊錶的時候,每次都要把尾部節點的next指標設定為空!以防當前尾部節點真的是最後乙個節點卻沒給next設定指標域為空 struct listnode class solution listnode temp pnode 此時指...
鍊錶(刪除重複的節點)
題目要求 在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 題解 先判空和長度是否為一 定義兩個指標和乙個傀儡節點 用cur當游標遍歷鍊錶,當cur的值和cur.next的值相等時,prev不動...
鍊錶 刪除鍊錶中重複的節點
刪除鍊錶中重複的節點 方法一 採用遞迴的方法,但這種方法在鍊錶無重複節點時效率不高 function deleteduplication phead if phead.val phead.next.val return deleteduplication node 採用遞迴的方法從下乙個不重複的點開...