leetcode 83删除排序链表中重复元素

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

示例 1:
输入: 1->1->2
输出: 1->2

思路:
一开始想到的用类似数组中删除重复元素的方法,用快慢指针。实际上链表一次遍历即可。
这题主要考查的是对链表节点的操作能力,有几点特别需要注意:

0、需要定义一个新的节点用来遍历,存储原链表的头节点,不然最终无法返回链表的头节点
1、如果出现重复元素,是给$node->next的赋值。
2、删除的节点如何回收内存呢
3、PHP对象是引用传值。参考<a href="https://segmentfault.com/q/1010000010641993" rel="noopener" target="_blank">这里</a>。

算法:

0、定义一个指针指向链表头节点。
1、遍历链表。直到当前节点为空,或者当前节点的next为空就截止。
2、如果当前节点的值跟下一个节点的值相等,当前节点的next指向next节点的next。$node->next = $node->next->next;
3、如果当前节点的值跟下一个节点的值不相等,指针指向下一个节点。$node = $node->next;
4、返回头节点。

PHP实现

class ListNode {
    public $val = 0;
    public $next = null;
    function __construct($val) { 
        $this->val = $val;
    }
}

class Solution
{
    /**
     * @param ListNode $head
     * @return ListNode
     */
    function deleteDuplicates($head) {
        $node = $head;
        while ($node != null && $node->next != null) {
            if ($node->val != $node->next->val) {
                $node = $node->next;
            } else {
                // 注意这里是给$node->next赋值
                $node->next = $node->next->next;
            }
        }

        return $head;
    }
}

时间复杂度:O(n)

参考:
维基百科:单向链表

发表评论

电子邮件地址不会被公开。 必填项已用*标注