1. 程式人生 > 其它 >Remove Duplicates from Sorted List

Remove Duplicates from Sorted List

Source

Given a sorted linked list,
delete all duplicates such that each element appear only once.

Example
Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3.

題解

遍歷之,遇到當前節點和下一節點的值相同時,刪除下一節點,並將當前節點next值指向下一個節點的next, 當前節點首先保持不變,直到相鄰節點的值不等時才移動到下一節點。

C++

/**
 * Definition of ListNode
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *         this->val = val;
 *         this->next = NULL;
 *     }
 * }
 
*/ class Solution { public: /** * @param head: The first node of linked list. * @return: head node */ ListNode *deleteDuplicates(ListNode *head) { if (head == NULL) { return NULL; } ListNode *node = head; while (node->next != NULL) {
if (node->val == node->next->val) { ListNode *temp = node->next; node->next = node->next->next; delete temp; } else { node = node->next; } } return head; } };

Java

/**
* Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public ListNode deleteDuplicates(ListNode head) { if (head == null) return null; ListNode node = head; while (node.next != null) { if (node.val == node.next.val) { node.next = node.next.next; } else { node = node.next; } } return head; } }

原始碼分析

  1. 首先進行異常處理,判斷head是否為NULL
  2. 遍歷連結串列,node->val == node->next->val時,儲存node->next,便於後面釋放記憶體(非C/C++無需手動管理記憶體)
  3. 不相等時移動當前節點至下一節點,注意這個步驟必須包含在else中,否則邏輯較為複雜

while迴圈處也可使用node != null && node->next != null, 這樣就不用單獨判斷head是否為空了,但是這樣會降低遍歷的效率,因為需要判斷兩處。

複雜度分析

遍歷連結串列一次,時間複雜度為 O(n), 使用了一箇中間變數進行遍歷,空間複雜度為 O(1).