【面接問題02.01】重複ノードの削除
タイトル
タイトルリンクはコードを記述し、ソートされていないチェーンテーブルの重複ノードを削除します.最初に表示されたノードを保持します.
例1:
例2:
ヒント:
実現構想.
考え方1:問題を読み終わったらすぐに上手になり、これは簡単すぎると思います.set集合を利用して重複するデータをフィルタし、頭挿し法を利用して新しいチェーンテーブルを構築します.コードは次のとおりです.
その結果、hashsetが無秩序であることを忘れ、出力されたデータが昇順に配列されていることを忘れました.だからgg、値が合わない.考えを変える.
考え方2:hashsetを利用するか、チェーンテーブルをループしてhashsetに次のノードのvalが存在する場合、次のノードを削除します.さもないと下を遍歴し続けると、重くなることができます.
コードは次のとおりです.
タイトルリンクはコードを記述し、ソートされていないチェーンテーブルの重複ノードを削除します.最初に表示されたノードを保持します.
例1:
:[1, 2, 3, 3, 2, 1]
:[1, 2, 3]
例2:
:[1, 1, 1, 1, 2]
:[1, 2]
ヒント:
1. [0, 20000] 。
2. [0, 20000] 。
実現構想.
考え方1:問題を読み終わったらすぐに上手になり、これは簡単すぎると思います.set集合を利用して重複するデータをフィルタし、頭挿し法を利用して新しいチェーンテーブルを構築します.コードは次のとおりです.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
if (head == null) {
return head;
}
ListNode h = head;
ListNode temp = new ListNode(0);
ListNode root = temp;
HashSet hashSet = new HashSet<>();
while (h != null) {
hashSet.add(h.val);
h = h.next;
}
//
for (int n : hashSet) {
ListNode p = new ListNode(n);
temp.next = p;
temp = p;
}
return root.next;
}
}
その結果、hashsetが無秩序であることを忘れ、出力されたデータが昇順に配列されていることを忘れました.だからgg、値が合わない.考えを変える.
考え方2:hashsetを利用するか、チェーンテーブルをループしてhashsetに次のノードのvalが存在する場合、次のノードを削除します.さもないと下を遍歴し続けると、重くなることができます.
コードは次のとおりです.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeDuplicateNodes(ListNode head) {
if (head == null) {
return head;
}
HashSet hashSet = new HashSet<>();
ListNode p = head;
// hashset
hashSet.add(p.val);
//
while (p.next != null) {
// hashset next val next next val next next next
if (!hashSet.add(p.next.val)) {
p.next = p.next.next;
} else {
p = p.next;
}
}
return head;
}
}