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

题目描述

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

输入描述

两个单调递增的链表

输出描述

一个单调不减的链表

题目分析

节点申明:

public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}

解法一 (递归) 运行时间:31ms  占用内存:629k

public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1==null) return list2;
        if(list2==null) return list1;

        ListNode mergeHead=null;
        if(list1.val<=list2.val){
            mergeHead = list1;
            mergeHead.next = Merge(list1.next,list2);
        }else{
            mergeHead = list2;
            mergeHead.next = Merge(list1,list2.next);
        }
        return mergeHead;
    }
}

  首先,判断链表是否为空,如果其中一个为空就直接返回另一个链表。

  因为合并后的链表要满足单调不减,比较两个链表当前头结点,值较小的赋值给合并链表的当前节点,依次递归下一个节点。

  依次返回合并链表的当前节点。

解法二  运行时间:31ms  占用内存:629k

public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1==null) return list2;
        if(list2==null) return list1;

        ListNode mList=new ListNode(0);
        ListNode point =mList;

        while(list1!=null && list2!=null){
          if(list1.val<=list2.val){
            point.next=list1;
            list1=list1.next;
           }else{
            point.next = list2;
            list2=list2.next;
          }
           point = point.next;
        }

        if(list1==null){
            point.next=list2;
        }else{
            point.next=list1;
        }
        return mList.next;
    }
}

①首先,判断链表是否为空,如果其中一个为空就直接返回另一个链表。

②申明合并链表的头结点和指针节点

③循环比较两个链表的头结点的值,让当前的point节点指向值较小的那个节点,该节点等于其下一个节点,同时point向后移。

④判别循环后,如果有链表没遍历完,直接加在point后面

⑤返回头结点的下一个节点(头结点是新建的节点)

这个思想很简单:就是新建一个头结点,依次比较两个链表的节点的值,用next指针把他们依次串联起来。

时间: 2024-11-02 04:35:45

[剑指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-16:合并两个有序链表

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 例如A链表为1-3-5-7,B链表为2-4-6-8.所以合并后的新链表C为1-2-3-4-5-6-7-8 节点定义如下: public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } 思路:利用递归 public ListNode Merge(ListNode 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 (37) 两个链表的第一个公共结点

题目:输入两个链表,找出它们的第一个公共结点 如果两个链表有公共结点,那么公共结点一定出现在两个链表的尾部 如果两链表长度不相等,那么达到公共结点的步数就不一致,如何确保 两个链表从头开始遍历,同步达到公共结点? 这是关键所在 如果两链表长度相同,那么就可以同步达到了? 由此,我们就需要 让两个链表长度"相等" 我们假设 两链表长度分别为m和n,且m > n, 那么我们可以在较长链表中 先走 m - n 步,然后 两个链表游标同步走,如果有公共结点,那么就一定同时达到 ListN

【剑指offer】两个链表的第一个公共结点

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26097395 简单题,剑指offer上的第37题,九度OJ上AC. 题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表的元素的个数.接下来的两行,第一行为第一个链表的所有元素,中间用空格隔开.第二行为第二个链表的所有元素,中间用空格隔开. 输出: 对应

【剑指offer】数字在排序数组中出现的次数

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27364557 题目描写叙述: 统计一个数字在排序数组中出现的次数. 输入: 每一个測试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每一个元素均为int. 第三行有1个整数m,表示接下来有m次查询.1<=m<=10^3. 以下有m行,每行有一个整数k,表示要查询的数. 输出: 相应每一个測试案例,有m行输出,