C++单链表反转、两有序链表合并仍有序

  1 #include<iostream>
  2
  3 struct Node
  4 {
  5     int data;
  6     Node *next;
  7 };
  8
  9 typedef struct Node Node;
 10
 11 Node *Reverse(Node *head)
 12 {
 13     if (NULL == head || NULL == head->next)
 14         return head;
 15     Node *p1 = head;
 16     Node *p2 = p1->next;
 17     Node *p3 = p2->next;
 18     p1->next = NULL;
 19     while (p3 != NULL)
 20     {
 21         p2->next = p1;
 22         p1 = p2;
 23         p2 = p3;
 24         p3 = p3->next;
 25     }
 26
 27     p2->next = p1;
 28     head = p2;
 29     return head;
 30 }
 31
 32 // 循环算法
 33 Node *Merge(Node *head1, Node *head2)
 34 {
 35     if (NULL == head1)
 36         return head2;
 37     if (NULL == head2)
 38         return head1;
 39     Node *head = NULL;
 40     Node *p1 = NULL;
 41     Node *p2 = NULL;
 42     if (head1->data < head2->data)
 43     {
 44         head = head1;
 45         p1 = head1->next;
 46         p2 = head2;
 47     }
 48     else
 49     {
 50         head = head2;
 51         p2 = head2->next;
 52         p2 = head1;
 53     }
 54
 55     Node *cur = head;
 56     while (NULL!=p1 && NULL!=p2)
 57     {
 58         if (p1->data < p2->data)
 59         {
 60             cur->next = p1;
 61             cur = p1;
 62             p1 = p1->next;
 63         }
 64         else
 65         {
 66             cur->next = p2;
 67             cur = p2;
 68             p2 = p2->next;
 69         }
 70     }
 71     if (NULL == p1)
 72         cur->next = p2;
 73     if (NULL == p2)
 74         cur->next = p1;
 75
 76     return head;
 77 }
 78
 79 // 递归算法
 80 Node *MergeRecursive(Node *head1, Node *head2)
 81 {
 82     if (NULL == head1)
 83         return head2;
 84     if (NULL == head2)
 85         return head1;
 86     Node *head = NULL;
 87
 88     if (head1->data < head2->data)
 89     {
 90         head = head1;
 91         head->next = MergeRecursive(head1->next, head2);
 92     }
 93     else
 94     {
 95         head = head2;
 96         head->next = MergeRecursive(head1, head2->next);
 97     }
 98
 99     return head;
100 }
101
102 int main(void)
103 {
104     return 0;
105 }
时间: 2024-11-07 08:16:20

C++单链表反转、两有序链表合并仍有序的相关文章

【链表】两个链表的第一个公共结点

输入两个链表,找出它们的第一个公共结点. 1 public class Solution { 2 3 /** 4 * 思路:两个链表相交,存在公共的链表尾,根据链表长度的差值,移动指针,找到第一个相同的节点,即为第一个公共节点 5 * @param pHead1 6 * @param pHead2 7 * @return 8 */ 9 public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { 10 11 if

链表操作 -- 两个链表间的相交性问题

本文参考: http://blog.csdn.net/g_brightboy/article/details/6824834 http://blog.csdn.net/huangxy10/article/details/8014233 在此致谢. 问题: 给定两个链表,判断它们是否相交. 注意: 如果两个链表相交的话,则公用相交点开始往后的所有节点.[因为节点的next指针只有一个!] 解答: 1)首先来看最直观的方法,也就是一次判断链表A中的节点是否在链表B中出现. 时间复杂度:O(n2) 空

c# 有序链表合并 链表反转

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LinkedListTest { class Program { static void Main(string[] args) { LinkList<int> linkA = new LinkList<int>(); linkA.A

单链表反转的2种方法

1 public class ReverseDemo { 2 3 /** 4 * 单链表反转的两种方法 5 */ 6 public static void main(String[] args) { 7 Node head =new Node("a"); 8 Node node2=new Node("b"); 9 Node node3=new Node("c"); 10 head.setNext(node2); 11 node2.setNext(

[链表]同时遍历两个链表

两个有序链表的合并 对于两个有序链表合并成一个新的有序链表的代码很简单,但是要注意一些测试用例: 比如说一个为空链表:两个链表不一样长,肯定最后有一个链表要单独的挂到结果链表中去的. ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(l1 == NULL) return l2; if(l2 == NULL) return l1; ListNode dummy(-1); ListNode *p = &dummy; while(l1 !

每天一个小算法(2)----合并两个有序链表

每天一个小算法还是有点没时间,尽量抽出时间写一写. 今天是合并有序的链表,对单链表有点忘了,尤其是指针指来指去的,有点晕,幸好基础还算好,想了想还是能想回来. 代码使用随机数函数生成一个链表,然后对链表排序,最后合并链表并打印,删除链表的函数于算法无关紧要,所以未实现^_^. 在Linux/g++下编译运行成功. 合并思路:和合并数组有些类同,比较两个节点的元素大小然后将小的摘下来尾插到链表bList中,然后指针指向下一个节点,最后直接把非空的链表合并到bList的末尾. 1 #include

02-线性结构1&#160;两个有序链表序列的合并

02-线性结构1 两个有序链表序列的合并   (15分) 编译器:gcc 时间限制:400ms 内存限制:64MB 代码长度限制:16kB 判题程序:系统默认 作者:DS课程组 单位:浙江大学 https://pta.patest.cn/pta/test/3512/exam/3/question/62612 本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列. 函数接口定义: List Merge( List L1, List L2 ); 其中List结构定义如下: t

线性结构习题1——两个有序链表序列的合并

本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列. 函数接口定义: List Merge( List L1, List L2 ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ L1和L2

02-线性结构1 两个有序链表序列的合并

02-线性结构1 两个有序链表序列的合并(15 分) 本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列. 函数接口定义: List Merge( List L1, List L2 ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNod