题目来源:https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/
问题描述
82. Remove Duplicates from Sorted List II
Medium
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
Example 1:
Input: 1->2->3->3->4->4->5
Output: 1->2->5
Example 2:
Input: 1->1->1->2->3
Output: 2->3
------------------------------------------------------------
题意
去除一个有序链表中重复的元素(一个都不剩)。
------------------------------------------------------------
思路
维护两个指针base和cur. 当cur指向的节点的val不同于后继节点的val时,base指向cur, base和cur各前进一位;否则cur前进直至val不同于后继节点的val或者cur已经到链表尾。
易错点是当原链表链表尾是重复的val时,要把base->next置为null(代码Line 39),否则base仍会指向链表尾的那些重复的值的节点。
(在LeetCode上第一个用PHP写的题,纪念一下~~)
------------------------------------------------------------
代码
/**
* Definition for a singly-linked list.
* class ListNode {
* public $val = 0;
* public $next = null;
* function __construct($val) { $this->val = $val; }
* }
*/
class Solution {
/**
* @param ListNode $head
* @return ListNode
*/
function deleteDuplicates($head) {
if (!$head)
{
return $head;
}
$dummy = new ListNode(0);
$base = $dummy;
$cur = $head;
while ($cur->next)
{
if ($cur->val != $cur->next->val)
{
$base->next = $cur;
$base = $base->next;
$cur = $cur->next;
}
else
{
while ($cur->next && $cur->val == $cur->next->val)
{
$cur = $cur->next;
}
if (!$cur->next)
{
$base->next = null;
return $dummy->next;
}
$cur = $cur->next;
}
}
$base->next = $cur;
return $dummy->next;
}
}