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

RT。。。。

无聊帮朋友撸个 C++ 作业。。 = =

  1 /*
  2     无聊帮朋友撸个作业。。。。。。 \ = v = /
  3
  4     两个有序链表合成为一个有序链表.
  5     要求:
  6         1. 每个链表元素里的值不超过int范围.
  7         2. 两个链表要求为升序(从小到大).
  8
  9
 10                             2016.1.5   author : 加德满都的猫会爬树
 11
 12 */
 13
 14 #include <iostream>
 15 using namespace std;
 16 const int MAX = 100000;
 17 int save[MAX];
 18 struct node
 19 {
 20     int val;
 21     node * next ;
 22 };
 23 node * creat(int n , int * arr) // 根据 arr 数组中的 前 n 个数字 生成一条链表
 24 {
 25     if(!n) return NULL;
 26     node * root = new node;
 27     root -> val = arr[0];
 28     root -> next = NULL;
 29     node * pre = root ;
 30     for(int i = 1 ; i < n ; i++)
 31     {
 32         node * tmp = new node ;
 33         tmp -> val = arr[i];
 34         tmp -> next = NULL;
 35
 36         pre -> next = tmp;
 37         pre = tmp;
 38     }
 39     return root ;
 40 }
 41 void show(node * in) // 显示函数, 按顺序输出一条链表。
 42 {
 43     while(in != NULL)
 44     {
 45         cout << in -> val << " " ;
 46         in = in -> next;
 47     }
 48     cout << endl;
 49     return ;
 50 }
 51 void combine(node * A , node * B) // 合并两个链表,将 B 合成 至 A 链表上
 52 {
 53     if(A == NULL && B == NULL) return ; // 如果两个链表皆为空 , 返回 。
 54     if(A == NULL) // 如果 A 链表为空, 则 合并结果就为 B 链表。
 55     {
 56         A = B;
 57         return ;
 58     }
 59     if(B == NULL) return ; // 如果 B 链表为空, 合并结果就为 A 链表。
 60
 61     node * p1 = A , * cur = B ;
 62     while(cur != NULL && p1 -> val > cur -> val)
 63     {
 64         node * tmp = cur ;
 65         cur = cur -> next;
 66         tmp -> next = p1;
 67         p1 = tmp;
 68     }
 69     node * p2 = p1 -> next;
 70     while(cur != NULL)
 71     {
 72         if(p2 == NULL)
 73         {
 74             p1 -> next = cur;
 75             cur = NULL ;
 76             continue;
 77         }
 78         if(cur -> val < p2 -> val)
 79         {
 80             node * tmp = cur ;
 81             cur = cur -> next;
 82             p1 -> next = tmp;
 83             tmp -> next = p2;
 84             p1 = p1 -> next;
 85             continue;
 86         }
 87         p1 = p1 -> next;
 88         p2 = p2 -> next;
 89     }
 90     return ;
 91 }
 92 int main()
 93 {
 94     int n;
 95     cout << "请输入第一个链表的长度(数字个数) : ";
 96     cin >> n;
 97     if(n)
 98     {
 99         cout << "请输入第一个链表里的数字," << n << " 个. 空格隔开 : " ;
100         for(int i = 0 ; i < n ; i++) cin >> save[i];
101     }
102     node * A = creat(n , save);
103
104     cout << "请输入第二个链表的长度(数字个数) : ";
105     cin >> n;
106     if(n)
107     {
108         cout << "请输入第二个链表里的数字," << n << " 个. 空格隔开 : " ;
109         for(int i = 0 ; i < n ; i++) cin >> save[i];
110     }
111     node * B = creat(n , save);
112
113     combine(A , B);
114     cout << "合并后的结果 : " << endl;
115     show(A);
116
117     return 0;
118
119 }
时间: 2024-10-22 05:45:40

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

线性时间将两个有序链表合成一个有序链表(constant additional space)

description: given two sorted singly list, merge them into one using constant additional space algorithm: we will reference the two linked list as list1 and list2 for convenience, since list1 is sorted,just find the right position for each element in

【LeetCode】两个有序数组合成一个有序数组(NEW)

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n.你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素.示例: 输入:nums1 = [1,2,3,0,0,0], m = 3nums2 = [2,5,6], n = 3 输出: [1,2,2,3,5,6] 解法1: 之前如果不考虑合并,空间上新增一个数组

两个有序数组组成一个有序的数组

package com.hzins.suanfa; import java.util.Arrays; /** * * 两个有序数组组成一个有序的数组 * 整个循环层数为1 * 以其中一个数组做循环,注意另外一个的index是否溢出以及另外一个是否没有遍历完成 * * @author Administrator * */ public class Demo2 { /** * * 1,3,5,7 * 2,4,6,8 * @param a * @param b */ public static voi

27、输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路:同归并算法 本题: 1 public class Solution { 2 public ListNode Merge(ListNode list1, ListNode list2) { 3 ListNode head; 4 if (list1 == null) { 5 return list2; 6 } 7 if (list2 == null) { 8 return list1; 9 } 10

将两个无序链表合成一个链表

对于链表,可以先将两个链表排序,然后再将其枚举合成一个链表. 或者是先将一个链表接到另一个链表的尾部,然后将总链表排序. 1 #include <bits/stdc++.h> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 #include <malloc.h> 6 using namespace std; 7 struct Node{ 8 int date; 9

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

新增一个链表,然后分别采用2个指针指向这两个链表,每次比较链表的值,将较小的那一个存入新链表中.需要主要的是对空链表进行处理,主要还是考察代码的鲁棒性.总共2个链表,数组分别是1,3,5,7,和2, 4, 6,8 采用java进行实现. package com.test.algorithm; class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } public class Me

面试题:2个有序数组变为一个有序数组

剑指offer  面试题5的相关题目 2019.3 纽迈科技曾问过这个问题. 思路1 :直接将两个数组合并在一起,然后排序,这时候需要考虑是快排还是啥的排序算法,压根没考虑数组的有序性! 思路2:从头开始,分别比较对应数组,小的留下,这里需要一个问题,若2个数组的len不一样,这时候你要将剩下的那个较长的元素直接存储. 这里学习了.append()   .extend()  和 + 的用法,重新整理: 原文地址:https://www.cnblogs.com/ivyharding/p/11212

链表合成

题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 方法一:递归 public class MergeList { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ListNode list1 = new ListNode(); ListNode list2 = new ListNode(); Lis

C语言链表实例--玩转链表

下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 name,性别 sex 和成绩 score 等.另一个域为指针域,存放下一结点的首地址.链表中的每一个结点都是同一种结构类型. 指针域: 即在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域. 在第一个结点的指针域内存入第二个结点的首地址,在第二个结点的指针域