剑指offer-合并两个排序的链表

题目描述

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

public class Test {

    class ListNode {
        int value;
        ListNode next;
        public ListNode(int value) {
            this.value = value;
        }
    }
    /**
     * node1: 1->3->5->7;
     * node2: 2->4->6->8->9->10->11;
     * @param args
     */
    public static void main(String[] args) {
        Test t = new Test();
        ListNode node1 = t.new ListNode(1);
        ListNode node2 = t.new ListNode(2);
        ListNode node3 = t.new ListNode(3);
        ListNode node4 = t.new ListNode(4);
        ListNode node5 = t.new ListNode(5);
        ListNode node6 = t.new ListNode(6);
        ListNode node7 = t.new ListNode(7);
        ListNode node8 = t.new ListNode(8);
        ListNode node9 = t.new ListNode(9);
        ListNode node10 = t.new ListNode(10);
        ListNode node11= t.new ListNode(11);
        node1.next = node3;
        node2.next = node4;
        node3.next = node5;
        node4.next = node6;
        node5.next = node7;
        node6.next = node8;
        node7.next = null;
        node8.next = node9;
        node9.next = node10;
        node10.next = node11;
        node11.next = null;

        ListNode mergeNode = t.merge1(node1,node2);
        while(mergeNode != null) {
            System.out.println(mergeNode.value);  // 打印合并链表
            mergeNode = mergeNode.next;
        }
    }
    /**
     * 递归方法:调用自身进行比较合并,消耗内存。
     * @param head1
     * @param head2
     * @return
     */
    public ListNode merge(ListNode head1, ListNode head2) {
        // head1为空,返回head2
        if(head1 == null) return head2;
        // head2为空,返回head1
        if(head2 == null) return head1;
        // 记录合并链表
        ListNode node = null;
        if(head1.value > head2.value) {
            node = head2;
            node.next = merge(head1, head2.next);
        } else {
            node = head1;
            node.next = merge(head1.next, head2);
        }
        return node;
    }

    /**
     * 非递归方法:消耗内存少。
     * @param head1
     * @param head2
     * @return
     */
    public ListNode merge1(ListNode head1, ListNode head2) {
        // head1为空,返回head2
        if(head1 == null) return head2;
        // head2为空,返回head1
        if(head2 == null) return head1;
        // 记录合并链表
        ListNode tempNode = new ListNode(-1);
        // 指向合并链表的尾结点
        ListNode node = tempNode;

        // 两链表都不为空进行比较合并
        while(head1 !=null && head2 !=null) {
            if(head1.value < head2.value) {
                node.next = head1;
                head1 = head1.next;
            } else {
                node.next = head2;
                head2 = head2.next;
            }
            node = node.next; // 将指针移动到合并后链表的结尾,方便下次
        }
        // 如果第一个链表的元素未处理完,将其接到合并链表的最后一个结点之后
        if(head1 != null) {
            node.next = head1;
        }

        // 如果第二个链表的元素未处理完,将其接到合并链表的最后一个结点之后
        if(head2 != null) {
            node.next = head2;
        }
        return tempNode.next;
    }
}
时间: 2024-11-08 20:19:01

剑指offer-合并两个排序的链表的相关文章

python剑指offer 合并两个排序的链表

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # 返回合并后列表 def Merge(self, pHead1, pHead2): # write code here if pHead1 == None: re

剑指offer——合并两个排序的链表

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 代码实现(Java) 方案一:递归方法 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode Merge(ListNode

[剑指offer] 合并两个排序链表

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 输入描述 两个单调递增的链表 输出描述 一个单调不减的链表 题目分析 节点申明: public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } 解法一 (递归) 运行时间:31ms 占用内存:629k public class Solution { public Li

剑指OFFER——合并两个有序的链表

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 再做这道题就是想不起来书上怎么做的了,但是最近看STL里面全是这种基础的合并啊,比较啊.就算不会也看会了. 循环我用了4个指针.p和q分别指向两个链表当前需要比较的元素,l和k分别代表“新”的链表的旧节点和新节点,防止断了. 每次新比较的结果给k,l代表之前的节点. 循环: /* struct ListNode { int val; struct ListNode *next; ListNode(int

剑指Offer-16.合并两个排序的链表(C++/Java)

题目: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 分析: 可以用一个新的节点,来去比较两个单调递增的链表当前节点的值,如果p1当前的值小于p2,则新的节点的next=p1,p1移到下一个节点,新的节点p也要移动到下一个节点. 当然也可以用递归来做.C++常规做法,Java递归实现. 程序: C++ class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead

剑指offer17合并两个排序的链表

Tv运远厦7V籽4姓62http://shequ.docin.com/vkih86746 201m蚜疽6qg壤笛http://tushu.docin.com/fhqrw5685 8lUo孜拇迸si瓮怀2u4http://tushu.docin.com/sina_6367438287 N6DXQ7烟肝牧币5http://www.docin.com/app/user/userinfo?userid=179007252 4o料75HXN市范1Zhttp://weibo.com/p/1005056373

【剑指offer】Q17:合并两个排序的链表

def Merge(head1, head2): if head1 == None: return head2 if head2 == None: return head1 psuhead = ListNode(-1) tail = psuhead while head1 and head2: if head1.val < head2.val: cur = head1 head1 = head1.next else: cur = head2 head2 = head2.next cur.next

剑指Offer:合并两个排序的链表【25】

剑指Offer:合并两个排序的链表[25] 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 题目分析 每次都是比较箭头节点,把小节点连接到已经合并的链表之后,重复的执行此过程,最后如果那个链表已经走完,那就将另一个链表直接连接到合并的链表之后. Java题解 public static ListNode Merge(ListNode list1,ListNode list2) { if(list1==null) return list2;

剑指offer(十六) 合并两个排序的链表

合并两个排序的链表 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 用JavaScript非递归和递归方式都AC了. 非递归: function ListNode(x){ this.val = x; this.next = null; } function Merge(pHead1, pHead2) { if(!pHead1) { return !pHead2 ? null:pHead2; }else if(!pHead2) { retur