给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列
来源:力扣(LeetCode)
链接:力扣
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
package cn.fansunion.leecode.linkedlist; /** * 删除排序链表中的重复元素。 * 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 * 力扣 * @author wen.lei@brgroup.com * * 2022-1-28 */ public class RemoveDuplicatesFromSortedList { /** * 一次遍历搞定(网上还有递归版的解法,对于本题,递归解法不够简单明了,没必要) * 输入:head = [1,1,1,2,3,3];输出:[1,2,3] * @param head * @return */ public ListNode deleteDuplicates(ListNode head) { //利用链表的“指针”特性,遍历链表,通过修改next放弃中间重复节点来删除重复的节点 //当前节点,默认为头 ListNode current = head; //next不为null,current头尾很可能为null,需要判断 while (current!= null && current.next!= null ) { //next节点,相对于current的next ListNode next= current.next; //当前节点和下一个节点重复,修改当前节点的next指针跳过next //当前节点current“索引没变”,由于next变了,继续遍历current if (current.val==next.val) { current.next=next.next; } else { //遇到不重复的元素,进入到下一个不同数字的节点 current=current.next; } } return head; } } |
package test.leecode.linkedlist; import org.junit.Assert; import org.junit.Test; import cn.fansunion.leecode.linkedlist.ListNode; import cn.fansunion.leecode.linkedlist.RemoveDuplicatesFromSortedList; /** * @author wen.lei@brgroup.com * * 2022-2-15 */ public class RemoveDuplicatesFromSortedListTest { @Test public void test() { RemoveDuplicatesFromSortedList list = new RemoveDuplicatesFromSortedList(); //1,1,1,2,3,3 ListNode node3A = new ListNode( 3 , null ); ListNode node3 = new ListNode( 3 ,node3A); ListNode node2 = new ListNode( 2 ,node3); ListNode node1A = new ListNode( 1 ,node2); ListNode node1 = new ListNode( 1 ,node1A); ListNode head = new ListNode( 1 ,node1); list.deleteDuplicates(head); Assert.assertEquals( 1 , head.val); Assert.assertEquals( 2 , head.next.val); Assert.assertEquals( 3 , head.next.next.val); Assert.assertEquals( null , head.next.next.next); } } |