递归实现两个有序链表的合并

package com.wyl.linklist;

/**
 * 合并两个链表
 * @author wyl
 */
public class MergeLinkList {

    /**
     * 内部类,链表节点的结构
     * @author wyl
     *
     */
    public static class Node{
        private int val; //节点值
        private Node next; //节点的后继节点
        public Node(){
        }
        public Node(int val){
            this(val,null);
        }
        public Node(int val,Node next){
            this.val = val;
            this.next = next;
        }
        public int getVal() {
            return val;
        }
        public void setVal(int val) {
            this.val = val;
        }
        public Node getNext() {
            return next;
        }
        public void setNext(Node next) {
            this.next = next;
        }
    }
    /**
     * 递归实现两个排序链表的合并
     * @param l1
     * @param l2
     * @return
     */
    public Node merge(Node l1, Node l2){
        Node node = null;
        if(l1 == null || l2 == null){
            return l1==null?l2:l1;
        } else if(l1 != null || l2 != null){
            if(l1.val < l2.val){
                node = l1;
                node.next = merge(l1.next, l2);
            }else{
                node = l2;
                node.next = merge(l1, l2.next);
            }
        }
        return node;
    }
    public static void main(String[] args) {

        MergeLinkList mergeLinkList = new MergeLinkList();
        Node node = new Node(10); //存储排序好的偶数值节点
        for(int i=10; i>0; i=i-2){
            node = new Node(i, node);
        }

        Node node2 = new Node(15);//存储排序好的奇数值节点
        for(int i=15; i>0; i=i-2){
            node2 = new Node(i, node2);
        }

//        Node n = mergeLinkList.merge(node, node2);
//        Node n = mergeLinkList.merge(node, null);
//        Node n = mergeLinkList.merge(null, node2);
        Node n = mergeLinkList.merge(null, null);
        if(n != null){
            while(n.next != null){
                System.out.println(n.val);
                n = n.next;
            }
            System.out.println(n.val);
        }
    }
}
时间: 2024-12-18 09:24:14

递归实现两个有序链表的合并的相关文章

两个有序链表的合并

笔记和代码的思路来源: 好大学慕课浙江大学陈越.何钦铭的<数据结构> 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef int ElementType; 5 typedef struct Node *PtrToNode; 6 struct Node { 7 ElementType Data; 8 PtrToNode Next; 9 }; 10 typedef PtrToNode List; 11 12 List

将两个有序链表合并

题目:已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序.(保留所有结点,即便大小相同) 循环实现: 1.重新申请一个头结点,使用指针p指向他,每新加一个结点,就将指针p后移一位,即指针p永远指向新链表的尾结点 2.由于所用链表第一个结点不赋值,因此指针需要开始从头结点的下一个结点开始判断,如果两个指针都为非空,将data域较小的指针连在新链表的末尾 3.当两个指针有一个到达链表的结尾时,将没有到达末尾的链表连接到新链表之后 递归实现: 1.函数返回条件是有一个链表结

合并两个有序链表

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. (hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的元素的个数,m代表将要输入的第二个链表的元素的个数. 下面一行包括n个数t(1<=t<=1000000):代表链表一中的元素.接下来一行包含m个元素,s(1

链表--合并两个有序链表

leetcode 21 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 还是采用递归的方法,先贴出代码: public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if( l1 == null ) { return l2; } if( l2 == null ) {

【leetcode】21. 合并两个有序链表

描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 思路 别用递归,递归会慢. 其他没啥了,挺简单的. class Solution: def mergeTwoLists(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ head = ListNode(0) first = head while

LeetCode 第21题 合并两个有序链表

/*将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4输出:1->1->2->3->4->4 Definition for singly-linked list. public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } */ 1 class Solutio

合并两个有序链表(java实现)

题目: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4看到这个题,让我想起上次写的博客,合并两个有序的数组.这个题,是链表的合并,这就比较好移动,可以用递归实现链表的拼接所以,代码如下: /** * Definition for singly-linked list. * public class ListNode {

leecode刷题(23)-- 合并两个有序链表

leecode刷题(23)-- 合并两个有序链表 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 思路: 这道题我们可以用递归的方法来处理.首先我们可以设置一个临时头节点 head,当链表 l1 和链表 l2 不为空时,对它们进行比较.如果 l1 对应的节点小于或等于 l2 对应的节点,则将 head

LeetCode 21. Merge Two Sorted Lists合并两个有序链表 (C++)

题目: Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. Example: Input: 1->2->4, 1->3->4 Output: 1->1->2->3->4->4 分析: 将两个有序链表合并为一个新的有序链表并返