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

合并两个有序的单链表,合并之后的链表依然有序: 这道题经常被各公司考察。 例如: 链表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 mergeLinkList(Node head1, Node head2) {
        if (head1 == null && head2 == null) {
            // 如果两个链表都为空 return null;
        }
        if (head1 == null) {
            return head2;
        }
        if (head2 == null) {
            return head1;
        }
        Node head; // 新链表的头结点
        Node current; // current结点指向新链表
        // 一开始,我们让current结点指向head1和head2中较小的数据,得到head结点
        if (head1.data < head2.data) {
            head = head1;
            current = head1;
            head1 = head1.next;
        } else {
            head = head2;
            current = head2;
            head2 = head2.next;
        }
        while (head1 != null && head2 != null) {
            if (head1.data < head2.data) {
                current.next = head1;
                // 新链表中,current指针的下一个结点对应较小的那个数据
                current = current.next; // current指针下移
                head1 = head1.next;
            } else {
                current.next = head2;
                current = current.next;
                head2 = head2.next;
            }
        }
        // 合并剩余的元素
        if (head1 != null) {
            // 说明链表2遍历完了,是空的
            current.next = head1;
        }
        if (head2 != null) {
            // 说明链表1遍历完了,是空的
            current.next = head2;
        }
        return head;
    }

测试代码

    public static void main(String[] args) {
        LinkList list1 = new LinkList();
        LinkList list2 = new LinkList();
        // 向LinkList中添加数据
        for (int i = 0; i < 4; i++) {
            list1.add(i);
        }
        for (int i = 3; i < 8; i++) {
            list2.add(i);
        }
        LinkList list3 = new LinkList();
        list3.head = list3.mergeLinkList(list1.head, list2.head); // 将list1和list2合并,存放到list3中
        list3.print(list3.head);// 从head节点开始遍历输出
    }

测试结果:

0
1
2
3
3
4
5
6
7

时间: 2024-08-10 23:28:49

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

合并两个已序单链表

// 合并两个已序单链表 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

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

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

合并两个有序单链表

给出两个有序的单链表,将这两个单链表进行合并,合并出来的链表仍然是有序的. 比如给出链表1:1->3->6->7;链表2:2->4->5->8->9 合并后的链表为:1->2->3->4->5->6->7->8->9 代码展示如下(只给出实现部分) 结构体定义: typedef struct LinkNode { DataType data; struct LinkNode *next; }LinkNode,*pLi

Leetcode:Merge Two Sorted Lists 合并两个有序单链表

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. 代码如下: * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x

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

合并两个有序的单链表 给定两个有序单链表的头节点 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+

合并两个有序单链表的操作

/*以合并两个2个长度均为n的递增单链表为例 演示连个单链表的合并操作*/ #include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<stdio.h>#include<queue>#include<math.h>#define INF 0x3f3f3f3f#define MAX 1000005#define Temp 100

【剑指offer】合并两有序单链表

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25739727 九度OJ上AC,採用归并的思想递归实现. 题目描写叙述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们须要合成后的链表满足单调不减规则.(hint: 请务必使用链表.) 输入: 输入可能包括多个測试例子,输入以EOF结束.对于每一个測试案例,输入的第一行为两个整数n和m(0<=n<=1000, 0<=m<=1000):n代表将要输入的第一个链表的