将两个有序链表合并成一个有序链表

问题定义:

写一个函数SortedMerge函数,该函数有两个参数,都是递增的链表,函数的功能就是合并这两个递增的链表为一个递增的链表,SortedMerge的返回值是新的链表。新链表由前两个链表按元素递增顺序合并而成,也就是说它不会创建新的元素。

比如:这里有两个链表,分别是

list1: 5->10->15

list2: 2->3->20

SortedMerge函数返回一个指向新链表的指针,新链表应该是如下这样的:2->3->5->10->15->20

程序需要考虑如下情况:两个链表(函数参数)都有可能为空,也可能其中一个链表已经遍历完了,另一个链表还有很多元素。

使用递归:

合并操作是非常适合用递归来完成的一类操作,递归实现将会比迭代实现更加清晰且易于理解。尽管如此,你可能也不愿意使用递归来实现这个操作,因为递归方法所使用的栈空间与链表的长度成正比。

/*Using Recursion*/
struct node* SortedMerge(struct node* a, struct node* b)
{
    struct node* result = NULL;  

    /*Base cases*/
    if(a == NULL)
        return (b);
    else if(b == NULL)
        return (a);  

    /*Pick either a or b, and recur */
    if(a->data <= b->data)
    {
        result = a;
        result->next = SortedMerge(a->next, b);
    }
    else
    {
        result = b;
        result->next = SortedMerge(a, b->next);
    }
    return (result);
}  

时间: 2024-10-03 14:31:19

将两个有序链表合并成一个有序链表的相关文章

两个有序数组合并成一个有序数组

两个有序数组合并成一个有序数组 1. 题目描述 数组a是有序的,数组b也是有序的,如何高效地合并它们成一个数组,并且新数组也是有序的? 2. 从后往前合并 这道题目是师兄电面阿里的时候,问到的一道题目.现在我们来说一下解法~ 假设数组a足够长,可以在数组a上合并二者.我们的解法基本思想就是从后往前合并数组. 每次合并的时候,都要比较a和b当前数组的大小,取较大的值后移,注意一定要是后移! 为什么从后往前呢?其实就是为了方便后移,因为较大的一定是在后面的. 程序如下: #include<iostr

两个有序单链表合并成一个有序单链表的java实现

仅作为备注, 便于自己回顾. import java.util.Arrays; public class MergeSort { public static class LinkedNode<V extends Comparable<V>> { public V value; public LinkedNode<V> next; public LinkedNode(V value) { this.value = value; } public LinkedNode(V

算法 - 两个有序数组合并成一个有序数组

//两个有序数组的合并函数 public static int[] MergeList(int a[],int b[]) { int result[]; if(checkSort(a) && checkSort(b)) //检查传入的数组是否是有序的 { result = new int[a.length+b.length]; int i=0,j=0,k=0; //i:用于标示a数组 j:用来标示b数组 k:用来标示传入的数组 while(i<a.length &&

链表习题(7)-将两个递增单链表合并成一个递减单链表

1 /*将两个递增单链表合并成一个递减单链表*/ 2 /* 3 算法思想:两个链表已经按元素值递增次序排序,将其合并时,均从第一个结点起进行比较,将较小的 4 结点链入链表中,同时后移工作指针.由于结果链表是递减的,故使用头插法建立新链表.比较结束后, 5 可能会有一个链表非空,此时用头插法将剩下的结点依次插入新链表中即可. 6 */ 7 void Union_List(LinkList& La,LinkList& Lb) 8 { 9 LNode *r, *pa = La->next

将两个单向有序链表合并成一个单向有序链表

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 typedef struct student //声明结构体 5 { 6 int num; 7 struct student *pnext; 8 }stu,*pstu; 9 void link_sort_insert(pstu *,pstu *,int); //建立有序链表 10 void link_show(pstu ); 11 voi

线性数据结构案例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; // 头节点没

将两个有序链表合并为一个新链表

#include <iostream> #include <stdio.h> typedef struct _Node { int value; struct _Node *next; }Node; Node *MergeList(Node *listA, Node *listB); void PrintList(Node *head); int main() { Node lista, nodea, listb, nodeb, nodec; lista.value = 2; no

合并两个有序链表,合并后依然有序

PLinkList Merge(PLinkList pList1, PLinkList pList2) { PLinkList pList; PLinkList end; if (pList1 == NULL) { return pList2; } if (pList2 == NULL) { return pList1; } if (pList1 == pList2) { return pList1; } // 摘一个节点做为新头节点 if (pList1->data < pList2->

两个有序数组合并为一个有序数组

突然想到了这个算法,记得以前看过,但是没写,怕自己会写不出这个算法,于是就把它用JAVA写出来,呵呵. 思想:先依次比较两个数组,按照小的就传入新的数组.当这次比较完之后可能有一个数组的长度很长,留下一些数组,然后在新数组的末尾插入即可. 代码: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 class ArraySort{ //两个有序数组