栈和队列----合并两个有序的单链表

合并两个有序的单链表

  

  给定两个有序单链表的头节点 head1 和 head2,合并两个有序链表,合并后链表依然有序,并返回合并后的链表的头节点,例如:0->2->3->7->null   和   1->3->5->7->9->null,合并后的链表为 0->1->2->3->3->5->7->7->9->null。

  【解题思路】

  如果两个链表的长度分别为M 和 N ,那么时间复杂度可以做到 O(M+N),空间复杂度可以做到O(1)

  1. 如果有一个为空,直接返回另一个

  2. 比较两个头节点的值,较小的作为新的头节点

  3. 每次比较时,cur1和cur2 分别表示两个链表的值,pre永远表示上次比较时较小的值

package com.test;

import com.test.ListNode;

/**
 * Created by Demrystv.
 */
public class MergeTwoSortedListNode {

    public ListNode merge(ListNode head1, ListNode head2){

        if (head1 == null | head2 == null){
            return head1 == null ? head2 : head1;
        }

        ListNode head = head1.val < head2.val ? head1 : head2;
        ListNode cur1 = head == head1 ? head1 : head2;
        ListNode cur2 = head == head1 ? head2 : head1;

        ListNode pre = null;
        ListNode next = null;

        while (cur1 != null && cur2 != null){
            if (cur1.val < cur2.val){

                //这两句就是相当于指针的移动
                pre = cur1;
                cur1 = cur1.next;
            }else {

                //这一句就是先保存值
                next = cur2.next;
                //这两句指的是从上面的cur1切换过来,再切换回去
                pre.next = cur2;
                cur2.next = cur1;

                //这两句就是相当于指针的移动
                pre = cur2;
                cur2 = next;
            }
        }

        //针对空的情况做判断
        pre.next = cur1 == null ? cur2 : cur1;
        return head;
    }

}

  

原文地址:https://www.cnblogs.com/Demrystv/p/9404602.html

时间: 2024-08-26 03:02:27

栈和队列----合并两个有序的单链表的相关文章

合并两个有序的单链表,合并之后的链表依然有序【出现频率高】

合并两个有序的单链表,合并之后的链表依然有序: 这道题经常被各公司考察. 例如: 链表1:   1->2->3->4 链表2:   2->3->4->5 合并后:   1->2->2->3->3->4->4->5 解题思路:   挨着比较链表1和链表2.   这个类似于归并排序.尤其要注意两个链表都为空.和其中一个为空的情况.只需要O (1) 的空间.时间复杂度为O (max(len1,len2)) public Node me

算法总结之 合并两个有序的单链表

给定两个有序单链表的头节点head1 和 head2 ,请合并两个有序链表,合并后的链表依然有序,并返回合并后链表的头节点 假设两个链表长度为M和N 直接给出时间复杂度为(M+N) 额外空间复杂度O(1) 1 如果两个链表中一个为空  则无需合并 返回另一个的链表头节点 2 比较head1 和 head2 的值,小的是合并链表的头节点,记为head   在之后的步骤里 哪个链表的头节点值更小,另一个链表的所有节点都会一次插入到这个链表中 3不妨设head节点所在的链表1, 另一个链表2,1和2都

线性数据结构案例4 —— 合并两个有序的单链表 合并之后依然有序

一.介绍 emsp; 我们定义一个新链表然后,将两个链表的元素依次比较,放入比较最小的放到新链表前面. 二.代码 public static Node mergeByOrder(Node l1, Node l2) { if(l1.next == null || l2.next == null) { return l1.next == null ? l2 : l1; } Node newLinkedHead = new Node(0, ""); l1 = l1.next; // 头节点没

合并两个已序单链表

// 合并两个已序单链表 PSListNode MergeList(PSListNode pL1, PSListNode pL2) { PSListNode pNewHead = NULL ; PSListNode pL1Node = pL1 ; PSListNode pL2N0de = pL2 ; PSListNode pNode = NULL ; PSListNode pTailNode = NULL ; if (pL1 == NULL) { return pL2 ; } if (pL2 =

Leetcode21---&gt;Merge Two Sorted Lists(合并两个排序的单链表)

题目: 给出两个排序的单链表,合并两个单链表,返回合并后的结果: 解题思路: 解法还是很简单的,但是需要注意以下几点: 1.  如果两个链表都空,则返回null; 2.  如果链表1空,则返回链表2的头节点:反之,如果链表2为空,则返回链表1的头节点: 3.  两个链表都不空的情况下: 比较两个链表的头节点的值,哪个小,则新链表的头节点为哪个: 举例:l1: 1->3->5; l2:2->4->6->7;则:head = l1的头节点,此时head.next = l1.nex

合并两个排序的单链表

[题目] 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是依照递增排序的. [分析] 合并单链表,须要找到头结点,对照两个链表头结点后,确定头结点,再确定头结点下一个结点,循环递归的如前面一样操作确定每一个结点位置,同一时候考虑边界条件,假设两个链表为空.则肯定无需合并了,就是空链表,假设一个链表为空,还有一个不为空,则返回不为空的链表.详细分析流程能够看以下的样例: [測试代码] #include<stdio.h> #include<stdlib.h> #inclu

Leetcode刷题记(7)——合并两个有序链表

巴啦啦:中间竟然隔了三天没有动手,罪恶啊罪恶,时光时光总是悄悄溜去,把内疚留在心底~ 搬运工~ 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 解题思路:合并两个有序的单链表思路简单清晰,只用每次比较链表l1和l2的值,如果l1值小,则指针指向l1链表的下一个节点,否则指向l2链表的后一个节点, 最后如果某个链表已经遍历

算法题:合并两个有序的链表

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:已知有两个有序的单链表,其头指针分别为head1和head2,实现将这两个链表合并的函数: Node* ListMerge(Node *head1,Node *head2) 这个算法很像我们排序算法中的归并排序,只能说“很像”,因为思想是一样的,但是这个与归并排序还是有区别的,区别如下:      1.归并排序是针对有序数组,而这里是有序链表:        2.归并排序排序的时间复杂度为o(nlogn),而这里的时间复杂度最坏情况下为O

算法题:合并两个有序列表

说明:这篇文章是学习交流,转载请注明出处.欢迎转载! 题目:已知有两个有序的单链表,其头指针分别为head1和head2.实现将这两个链表合并的函数: Node* ListMerge(Node *head1,Node *head2) 这个算法非常像我们排序算法中的归并排序.仅仅能说"非常像",由于思想是一样的,可是这个与归并排序还是有差别的.差别例如以下:      1.归并排序是针对有序数组.而这里是有序链表:        2.归并排序排序的时间复杂度为o(nlogn),而这里的时