A与B链表合并成C链表(链表的归并)

A与B链表合并成C链表(链表的归并)

已知两个有序递增A链表和B链表(非空),将两个链表合并为C链表(同为递增有序),需要我们对链表的概念有一定掌握

对节点所需条件以及节点之间建立关系有所掌握。

这个题的重点是,并没有说明两个链表的具体长度,即两个链表可能不一样长,所以,在处理的时候需要注意,当某一个链表

操作完毕,另一个链表剩下的部分则可以直接接入C链表当中。

 1 void merge(LNode *A,LNode *B,LNode *C)
 2 {
 3     LNode *p = A->next;        //p来跟踪A的最小值节点,
 4     LNode *q = B->next;        //q来跟踪B的最小值节点
 5     LNode *r;                //定义一个指针,用作C链表的游标
 6     C = A;                    //C指向A链表的头结点
 7     C->next = NULL;            //这里可以去掉,因为下面两个if必须有一个执行
 8     free(B);                //释放掉B头结点
 9     r = C;                    //游标指向C头结点
10     while(p!=NULL && q!=NULL)        //当两个链表其中一个没有到达最后
11     {
12         if(p->data <= q->data)
13         {
14             r->next = p;
15             p = p->next;
16             r = r->next;
17         }
18         else{
19             r->next = q;
20             q = q->next;
21             r = r->next;
22         }
23     }
24     r->next = NULL;            //C链表最后next指针指向空
25
26     if(p!=NULL){
27         r->next = p;
28     }
29     if(q!=NULL)
30         r->next = q;
31 }

原文地址:https://www.cnblogs.com/whtmomo/p/11515106.html

时间: 2024-10-04 20:51:51

A与B链表合并成C链表(链表的归并)的相关文章

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

问题定义: 写一个函数SortedMerge函数,该函数有两个参数,都是递增的链表,函数的功能就是合并这两个递增的链表为一个递增的链表,SortedMerge的返回值是新的链表.新链表由前两个链表按元素递增顺序合并而成,也就是说它不会创建新的元素. 比如:这里有两个链表,分别是 list1: 5->10->15 list2: 2->3->20 SortedMerge函数返回一个指向新链表的指针,新链表应该是如下这样的:2->3->5->10->15->

链表--合并两个有序链表

leetcode 21 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 还是采用递归的方法,先贴出代码: public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if( l1 == null ) { return l2; } if( l2 == null ) {

单链表 --- 合并两个单链表

合并单链表 --> 一.解决方法: 确保两个单链表不为空,且二者皆有序(若无序,则先进行排序) 创建新的单链表,并比较原本两个单链表数据大小,较小者置于新单链表中 逐步将两个单链表的数据置于新单链表中,直至二者为空 二.程序代码: ListNode* MergeList(ListNode *L1,ListNode *L2)//合并两个单链表 { ListNode *newHead=NULL; ListNode *tail=NULL; if(L1==NULL) { return L2; } if(

链表 | 将两个递增链表合并为一个递减链表

王道P38T13 主代码: LinkList merge_desc(LinkList &A,LinkList &B){ LNode* C=new LNode; C->next=NULL; LNode *Ap=A->next,*Bp=B->next,*t,*r; while(Ap!=NULL && Bp!=NULL){ if(Ap->data < Bp->data){ //选择Ap t=Ap; Ap=Ap->next; }else{

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

#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

有序链表合并C语言递归版--我稍微会一点编程

假期最后一天,闲着没事编个程,天天吆喝自己不会编程,其实还是稍微会一点的. ??以下是一个有序链表合并的代码,一刻钟内盲写,花了10分钟左右调试通过,通篇只有一个if语句作为递归退出条件! #include <stdio.h> #include <stdlib.h> int a[] = {1,3,5,7,8,10,11,12,15,19,21,22,24,25,26}; int b[] = {2,4,5,6,9,16,17,18,27,30,31}; struct list { s

经典算法——合并K个有序链表

一.题目要求: 将K个有序链表合并为一个有序链表 二.实现方法: 方法一:利用最小堆方法 用一个大小为K的最小堆(用优先队列+自定义降序实现)(优先队列就是大顶堆,队头元素最大,自定义为降序后,就变成小顶堆,队头元素最小),先把K个链表的头结点放入堆中,每次取堆顶元素,然后将堆顶元素所在链表的下一个结点加入堆中. 整体测试代码: #include <vector> #include <iostream> #include<queue> #include<set&g

LeetCode 第23题 合并K个排序链表

/* 23. 合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6 */ /** * Definition for singly-linked list. public class ListNode { int val; ListNode next; ListNode(int * x

leecode刷题(23)-- 合并两个有序链表

leecode刷题(23)-- 合并两个有序链表 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 思路: 这道题我们可以用递归的方法来处理.首先我们可以设置一个临时头节点 head,当链表 l1 和链表 l2 不为空时,对它们进行比较.如果 l1 对应的节点小于或等于 l2 对应的节点,则将 head