lc中83题,牛客nc25题 题目描述 83. 删除排序链表中的重复元素 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。 例如: 给出的链表为1→1→2,返回1→2. 给出的链表为1→1→2→3→3,返回1→2→3.
思路 只需要判断当前节点和下一个节点值是否相同,如果相同那么当前节点的next就改为下一个节点的next。
public ListNode deleteDuplicates (ListNode head) {
ListNode p = head;
while(p != null && p.next != null){
if(p.val == p.next.val){
p.next = p.next.next;
}else{
p = p.next;
}
}
return head;
}
lc中82题,牛客nc24题 题目描述 82. 删除排序链表中的重复元素 II 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
例如: 给出的链表为1→2→3→3→4→4→5, 返回1→2→5. 给出的链表为1→1→1→2→3, 返回2→3.
思路 头结点重复不好判断,因此在头结点前再加一个节点,这样从头结点开始重复的话就跟链表内部重复一样处理了。 p是去探测是否有重复节点的指针,根据有还是没有重新调整q的next的赋值,保持q.next是p. 如图,每次外层while循环的情况。
public ListNode deleteDuplicates (ListNode head) {
if(head==null||head.next==null)
return head;
ListNode newHead = new ListNode(-1);
newHead.next = head;
ListNode p = head;
ListNode q = newHead;
while(p != null){
ListNode temp = p.next;
if(temp != null && temp.val == p.val){
while(temp != null && temp.val == p.val){
temp = temp.next;
}
q.next = temp;
p = temp;
}else{
q = p;
p = p.next;
}
}
return newHead.next;
}
|