【Java算法】链表合并去重算法

简介: 【Java算法】链表合并去重算法

删除有序列表中的重复元素

既然我们要删除一个有序的链表中的重复元素,那么我们可以这样子想。

如果这个元素与他的下一个元素重复了,那么我们就让这个元素的下一个元素覆盖这个元素即可,这样子就消除了一个重复的元素,重复这样子,就能做到把数组中的重复元素都去除。而如果不是重复的,那么我们直接让遍历指针下移即可。

//  * public class ListNode {
//  *     int val;
//  *     ListNode next;
//  *     ListNode() {}
//  *     ListNode(int val) { this.val = val; }
//  *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
//  * }
//  */
// class Solution {
//     public ListNode deleteDuplicates(ListNode head) {
//         ListNode headResult = head;
//         ListNode temp = head;
//         boolean flag = false;
//         while (head!=null) {
//             flag = false;
//             int cur = temp.val;
//             for (; temp!=null&&temp.val == cur; temp = temp.next) {
//                 flag = true;
//             }
//             if (flag) {
//                 head.next = temp;
//             }
//             head = head.next;
//         }
//         return headResult;
//     }
// }
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null) {
            return head;
        }
        ListNode cur = head;
        while (cur.next != null) {
            if (cur.val == cur.next.val) {
                cur.next = cur.next.next;
            } else {
                cur = cur.next;
            }
        }
        return head;
    }
}

有序链表合并

由于链表有序,因此我们可以定义一个头节点,之后将这两个链表的元素直接添加到这个头节点中即可。

如果链表1的元素大,那么就向头节点添加链表2的节点,并且让链表2节点后移一位。

之后,当某一条链表的元素都被添加到头节点后,会存在一条链表的元素还没有被添加到头节点,但是由于链表有序,因此这个剩下的元素,一定都比头节点中的元素大于或者等于,因此直接插入到头节点中即可。

public class ListNode {
      int val;
      ListNode next;
      ListNode() {}
      ListNode(int val) { this.val = val; }
     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  }
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
            ListNode prehead = new ListNode(-1);
            ListNode prev = prehead;
            while (l1 != null && l2 != null) {
                if (l1.val <= l2.val) {
                    prev.next = l1;
                    l1 = l1.next;
                } else {
                    prev.next = l2;
                    l2 = l2.next;
                }
                prev = prev.next;
            }
            // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
            prev.next = l1 == null ? l2 : l1;
            return prehead.next;
        }
}


相关文章
|
4天前
|
搜索推荐 算法 Java
Java数据结构与算法:排序算法之冒泡排序
Java数据结构与算法:排序算法之冒泡排序
|
4天前
|
搜索推荐 算法 小程序
基于Java协同过滤算法的电影推荐系统设计和实现(源码+LW+调试文档+讲解等)
基于Java协同过滤算法的电影推荐系统设计和实现(源码+LW+调试文档+讲解等)
|
4天前
|
搜索推荐 算法 小程序
基于Java协同过滤算法的图书推荐系统设计和实现(源码+LW+调试文档+讲解等)
基于Java协同过滤算法的图书推荐系统设计和实现(源码+LW+调试文档+讲解等)
|
4天前
|
搜索推荐 算法 Java
Java数据结构与算法:排序算法之选择排序
Java数据结构与算法:排序算法之选择排序
|
1天前
|
算法 Java 数据处理
Java中MD5加密算法的实现
Java中MD5加密算法的实现
|
3天前
|
存储 算法 安全
Java中的DES和3DES加密算法详解
Java中的DES和3DES加密算法详解
|
16小时前
|
存储 算法 搜索推荐
Java数据结构与算法优化
Java数据结构与算法优化
|
3天前
|
Java BI C#
技术笔记:SM4加密算法实现Java和C#相互加密解密
技术笔记:SM4加密算法实现Java和C#相互加密解密
|
3天前
|
机器学习/深度学习 并行计算 搜索推荐
程序技术好文:桶排序算法及其Java实现
程序技术好文:桶排序算法及其Java实现
|
3天前
|
Java 数据处理 API
使用Java Lambda表达式高效去重:一种优雅的数据处理实践
使用Java Lambda表达式高效去重:一种优雅的数据处理实践
7 0