将两个有序链表合并,合并后仍然有序

思路:因为A,B链表中元素有序,要使归并后的C也有序,可以每次从A、B中挑出最小的元素插入C的尾部,这样循环插入完成后,C也一定是有序的。

 1 struct LinkList{
 2     int data;
 3     LinkList *next;
 4 }
 5
 6 void Merge(LinkList *A,LinkList *B,LinkList *&C)
 7 {
 8     LinkList *p = A->next;    // 定义p结点跟踪 A中的结点
 9     LinkList *q = B->next;    // 定义q结点跟踪 B中的结点
10
11     C = A;
12     C->next = NULL;
13     free(B);
14
15     LinkList *r = C;   //  定义一个跟踪结点,永远指向C的终端结点
16
17     while(p!=NULL&&q!=NULL){
18         if(p->data <= q->data){
19             r->next = p;
20             p = p->next;
21             r = r->next;
22         }else{
23             r->next = q;
24             q = q->next;
25             r = r->next;
26         }
27     }
28
29     if(p!=NULL) r->next = p;
30     if(q!=NULL) r->next = q;
31 }

原文地址:https://www.cnblogs.com/ll-10/p/9698815.html

时间: 2024-12-15 16:05:28

将两个有序链表合并,合并后仍然有序的相关文章

递归实现两个有序链表的合并

package com.wyl.linklist; /** * 合并两个链表 * @author wyl */ public class MergeLinkList { /** * 内部类,链表节点的结构 * @author wyl * */ public static class Node{ private int val; //节点值 private Node next; //节点的后继节点 public Node(){ } public Node(int val){ this(val,nu

有序链表的合并

/* Name: 有序链表的合并 Copyright: Author: 巧若拙 Date: 22-11-14 16:13 Description: 分别用递归和非递归两种方式实现两个有序链表(不含头结点)的合并 */ #include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef char ElemType; typedef int Status; //函数类型,其值是函数结果状态代码,如OK等 typed

【LeetCode】21. Merge Two Sorted Lists合并两个有序链表,得到新的有序链表

一.描述: 二.思路: 两个有着相同排序类型(降序或升序)的链表,合并为一新的链表,并且要求有序(和两个子链表的排序相同): 判断2个子链表是否为空,若有空链表,则返回另一不为空的链表: 两者均不为空,判断链表结点值val的大小,(此处应该有2中排序结果,大->小 或 小->大),该题中提交只接受 小->大 类型: 故新的链表头指针指向val值较小的结点,子链表中去除已经被新链表指向的结点,再次重复该操作,即新链表头指针.next指向下一个较小值对应的结点--,即递归实现. 三.代码:

多个有序链表的合并

1, 先将问题简化,合并两个有序链表 首先分析合并两个链表的过程.我们的分析从合并两个链表的头结点开始.链表1的头结点的值小于链表2的头结点的值,因此链表1的头结点将是合并后链表的头结点.如下图所示. 参考:http://www.cnblogs.com/jason2013/articles/4341153.html 使用递归方法,一步步生成头结点,代码如下 递归的要诀是子问题要和父问题完全一样,只是规模变小(每次调用,更小的参数值), 1 List merge(List head1, List

两个排序链表的合并(Easy)

问题来源:选自leetcode 21:合并两个有序链表 问题描述: 题目给定信息: 给定两个有序链表,把两个链表合并成一个链表,并且合并后的链表依然是有序的.这两个链表中允许有重复元素 问题分析: 设置一个临时头节点,同时遍历两个原链表,遍历循环的条件是两个链表都不为空的情况下循环才能继续执行.每次遍历两个链表的节点都要比较两个节点的大小,然后把较小的哪一个节点保存在新建临时头节点所表示链表中.但我们要考虑一些特殊的情况,两个链表长度不一样的时候,当循环推出时候还会有一个链表没有遍历结束,这时候

数据结构学习---有序链表的合并

递归调用 简单 有点像归并排序的合并部分吧. 因为是用vs创建的工程,所以主函数是_tmain. 1 // 链表.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 6 7 typedef struct Node { 8 int data; 9 struct Node *next; 10 11 } LinkList; 12 13 14 //链表组合的函数 输入:两个有序无头结点链表 输出:将链表组合成一个无头结点有序链表 15 Lin

两个有序链表的合并

笔记和代码的思路来源: 好大学慕课浙江大学陈越.何钦铭的<数据结构> 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef int ElementType; 5 typedef struct Node *PtrToNode; 6 struct Node { 7 ElementType Data; 8 PtrToNode Next; 9 }; 10 typedef PtrToNode List; 11 12 List

两个单链表的合并,并排序

/*先看看单链表的知识很快就能做出来 这个用三个结构体指针,两个p1,p2指向建立的链表,一个p3指向新的链表判断判断p1p2指向的数据那个小,小的赋值给p3->next(升序),小的那个p1(p2)下移一个赋值顺序要搞对,要不然指向有误 */ #include<stdlib.h>#include<stdio.h>#include<malloc.h>typedef struct node{ int data; struct node *next;}lnode,*l

两个有序单链表的合并

已知两个单链表pHead1 和pHead2 各自有序,把它们合并成一个链表依然有序这个类似归并排序.尤其注意两个链表都为空,和其中一个为空时的情况.只需要O(1)的空间.时间复杂度为O(max(len1, len2)) 1 public static Node mergeSortedList(Node head1, Node head2) { 2 // 其中一个链表为空的情况,直接返回另一个链表头,O(1) 3 if (head1 == null) { 4 return head2; 5 } 6

合并k个有序链表

题目: 合并k个有序链表,并将结果用一个有序链表输出 例如:输入: [   1->4->5,   1->3->4,   2->6 ] 输出: 1->1->2->3->4->4->5->6 思路: 假设k个链表的总元素数目为n.首先想到两两合并列表,在序列1和2合并,3和4合并,依次类推.直到合并的只剩一个链表.这种操作的时间复杂度为O(nlog(k)),空间复杂度为O(1).python代码如下: class Solution(obj