本文共 3193 字,大约阅读时间需要 10 分钟。
在一个已经排序好的链表中,存在重复的结点,我们需要删除这些重复结点。重复的结点不予保留,返回处理后得到的链表头指针。例如,链表1→2→3→3→4→4→5,处理后应变为1→2→5。
为了解决这个问题,我们可以使用哈希集合(HashSet)的方法,这种方法可以在O(n)的时间复杂度内解决问题,并在最坏情况下的空间复杂度为O(n),其中n是链表的长度。具体步骤如下:
import java.util.HashSet;public class Solution18 { public static void main(String[] args) { ListNode1 listNode1 = new ListNode1(1); ListNode1 listNode2 = new ListNode1(2); ListNode1 listNode3 = new ListNode1(3); ListNode1 listNode4 = new ListNode1(3); ListNode1 listNode5 = new ListNode1(4); ListNode1 listNode6 = new ListNode1(4); ListNode1 listNode7 = new ListNode1(5); listNode1.next = listNode2; listNode2.next = listNode3; listNode3.next = listNode4; listNode4.next = listNode5; listNode5.next = listNode6; listNode6.next = listNode7; ListNode1 res = deleteDupcreationHash(listNode1); System.out.println(res); } public static ListNode1 deleteDupcreationHash(ListNode1 pHead) { if (pHead == null || pHead.next == null) { return pHead; } HashSethashSet = new HashSet<>(); ListNode1 pre = pHead; ListNode1 cur = pHead.next; while (cur != null) { if (pre.val == cur.val) { hashSet.add(cur.val); } pre = cur; cur = cur.next; } while (pHead != null && hashSet.contains(pHead.val)) { pHead = pHead.next; } if (pHead == null) { return null; } pre = pHead; cur = pHead.next; while (cur != null) { if (hashSet.contains(cur.val)) { pre.next = cur.next; cur = cur.next; } else { pre = cur; cur = cur.next; } } return pHead; } public static ListNode1 deleteDupcreation(ListNode1 pHead) { if (pHead == null || pHead.next == null) { return pHead; } ListNode1 head = new ListNode1(Integer.MIN_VALUE); head.next = pHead; ListNode1 pre = head; while (pre.next != null) { cur = pre.next; if (cur.next != null && cur.next.val == cur.val) { while (cur.next != null && cur.next.val == cur.val) { cur = cur.next; } pre.next = cur.next; cur = cur.next; } else { pre = cur; cur = cur.next; } } return head.next; }}class ListNode1 { int val; ListNode1 next = null; public ListNode1(int val) { this.val = val; } @Override public String toString() { return "ListNode1{" + val + ", next=" + next + '}'; }}
这种方法高效且简洁,能够在O(n)的时间复杂度内处理问题,适用于各种规模的链表。
转载地址:http://zufdz.baihongyu.com/