牛客网-合并两个排序的链表

简介: 牛客网-合并两个排序的链表

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

解法1 歪门邪道

/*
public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}*/
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
         List<Integer> list = new ArrayList<>();
        while (list1!=null){
            list.add(list1.val);
            list1=list1.next;
        }
        while (list2!=null){
            list.add(list2.val);
            list2=list2.next;
        }
        //排序  1 < 2 < 3 < 4  递增的顺序
        Collections.sort(list);
        ListNode
                head=null,//头
                tail=null,//尾
                newnode=null;//每次创建的新节点
        for (int i = 0; i < list.size(); i++) {
            //创建新的节点
            newnode=new ListNode(list.get(i));
            //如果是第一个节点,就选创建出来头节点
            if(i==0){
                head =tail= newnode;
            }else{
                //如果不是最后一个节点就往next添加节点
                tail.next = newnode;
                tail=newnode;
            }
        }
        return head;
    }
}

解法2 非递归

/*
public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        //合并前先判断一下两个链表是否为空,如果单个为空就直接返回
        if(list1==null)
            return list2;
        if(list2==null)
            return list1;
        /*
            合并中,无非就是比较各自首节点谁小,就把该节点从原链表中删除,在尾插到新节点处。
            比较中,两个链表任何一个都不能为空。
        */
        ListNode head = null;
        ListNode end = null;
        //只有两个都不为空的时候,才同时进行比较
        while(list1!=null && list2!=null){
            //比较,找到节点小的一个
            ListNode p = list1.val < list2.val ? list1 : list2;
            //如果这个小的节点是list1,那么list1就往后走一个
            if( list1 == p){
                list1 = list1.next;
            }else{
                //否则list2就往后走
                list2 = list2.next;
            }
            //判断是否是第一次,如果是第一次合并的话,就不能往.next处放,直接赋值就可
            if(head == null){
                head = p;
                end = p;
            }else{
                end.next=p;
                end=p;
            }
        }
        /*
            合并之后,可能会存在这么三种情况:
             1、list1为空,但是list2不为空;
             2、list1不为空,但是list2为空;
             3、list1和list2都为空。
             需要针对这三种情况做处理
        */
        if(list1 == null){
            end.next = list2;
        }
        if(list2==null){
            end.next = list1;
        }
        return head;
    }
}

解法3 递归法

/*
public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1==null)
            return list2;
        if(list2==null)
            return list1;
        //合并中,找到第一个小的节点        
        ListNode newNode = null;
        if(list1.val < list2.val){
            newNode = list1;
            list1 = list1.next;
        }else{
            newNode = list2;
            list2 = list2.next;
        }
        //合并剩下的节点
        newNode.next = Merge(list1,list2);
        return newNode;
    }
}


目录
相关文章
|
6天前
《剑指offer》——合并两个排序的链表
《剑指offer》——合并两个排序的链表
|
6天前
|
Java C语言
剑指offer(牛客)——合并两个排序的链表
剑指offer(牛客)——合并两个排序的链表
9 1
|
6天前
【力扣】148. 排序链表
【力扣】148. 排序链表
|
6天前
【力扣】83. 删除排序链表中的重复元素、82. 删除排序链表中的重复元素Ⅱ
【力扣】83. 删除排序链表中的重复元素、82. 删除排序链表中的重复元素Ⅱ
|
6天前
|
存储 JavaScript
leetcode82. 删除排序链表中的重复元素 II
leetcode82. 删除排序链表中的重复元素 II
25 0
|
6天前
leetcode83. 删除排序链表中的重复元素
leetcode83. 删除排序链表中的重复元素
12 0
|
6天前
|
算法
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
|
6天前
|
存储
LeetCode刷题---817. 链表组件(哈希表)
LeetCode刷题---817. 链表组件(哈希表)
|
6天前
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
6天前
|
算法 安全 数据处理
LeetCode刷题---707. 设计链表(双向链表-带头尾双结点)
LeetCode刷题---707. 设计链表(双向链表-带头尾双结点)